当前位置:   article > 正文

Codeforces div2 E. Madoka and The Best University

madoka and the best university

题意: 对于任意三元组{(a,b,c)|a+b+c<n},计算lcm(c,gcd(a,b))的累和

思路:首先想到的是枚举a,b,计算c,暴力出结果,但是n^2的时间复杂度让人望而却步,因此我们转换枚举对象,枚举gcd(a,b),那么如何计算出c?加一层枚举(调和级数),枚举a与b的和,为gcd(a,b) 的倍数,那么问题就转化成了,在a与b的和一定的情况下,计算gcd(a,b)一定值的a,b个数,我们将a设为x,b设为k(a+b的和)-x

有如下转换gcd(x,k-x)==g(a,b的最大公约数)==>gcd(x/g,(k-x)/g)==1==>gcd(x/g,k/g)==1,因此,题目变成了求小于k/g的与其互质的数量,即phi[k/j]

欧拉函数求解

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<queue>
  5. #include<map>
  6. #include<set>
  7. #include<vector>
  8. #include<algorithm>
  9. #include<string>
  10. #include<bitset>
  11. #include<cmath>
  12. #include<array>
  13. #include<atomic>
  14. #include<sstream>
  15. #include<stack>
  16. #include<iomanip>
  17. //#include<bits/stdc++.h>
  18. //#define int ll
  19. #define pb push_back
  20. #define endl '\n'
  21. #define x first
  22. #define y second
  23. #define Endl endl
  24. #define pre(i,a,b) for(int i=a;i<=b;i++)
  25. #define rep(i,b,a) for(int i=b;i>=a;i--)
  26. #define si(x) scanf("%d", &x);
  27. #define sl(x) scanf("%lld", &x);
  28. #define ss(x) scanf("%s", x);
  29. #define YES {puts("YES");return;}
  30. #define NO {puts("NO"); return;}
  31. #define all(x) x.begin(),x.end()
  32. using namespace std;
  33. typedef long long ll;
  34. typedef unsigned long long ull;
  35. typedef pair<int, int> PII;
  36. typedef pair<int, PII> PIII;
  37. typedef pair<char, int> PCI;
  38. typedef pair<int, char> PIC;
  39. typedef pair<double, double> PDD;
  40. typedef pair<ll, ll> PLL;
  41. const int N = 200010, M = 2 * N, B = N, MOD = 1000000007;
  42. const int INF = 0x3f3f3f3f;
  43. const ll LLINF = 0x3f3f3f3f3f3f3f3f;
  44. int dx[4] = { -1,0,1,0 }, dy[4] = { 0,1,0,-1 };
  45. int n, m, k;
  46. int phi[N];
  47. int primes[N], countNum;
  48. bool st[N];
  49. ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
  50. ll lowbit(ll x) { return x & -x; }
  51. ll qmi(ll a, ll b, ll mod) {
  52. ll res = 1;
  53. while (b) {
  54. if (b & 1) res = res * a % mod;
  55. a = a * a % mod;
  56. b >>= 1;
  57. }
  58. return res;
  59. }
  60. inline void init() {}
  61. void get_phi(int n)
  62. {
  63. pre(i, 2, n)
  64. {
  65. if (!st[i]) { primes[countNum++] = i; phi[i] = i - 1; }
  66. for (int j = 0; primes[j]<=n/i; j++)
  67. {
  68. st[i * primes[j]] = true;
  69. if (i % primes[j] == 0) {
  70. phi[i * primes[j]] = phi[i] * primes[j];
  71. break;
  72. }
  73. phi[i * primes[j]] = phi[i] * (primes[j] - 1);
  74. }
  75. }
  76. }
  77. ll lcm(ll a, ll b)
  78. {
  79. return a * b / gcd(a, b);
  80. }
  81. void slove()
  82. {
  83. cin >> n;
  84. ll ans = 0;
  85. get_phi(n);
  86. pre(g, 1, n)
  87. {
  88. for (int ab = g; ab < n; ab += g)
  89. {
  90. int c = n - ab;
  91. ans = (ans+(lcm(c, g) * phi[ab / g])%MOD)%MOD;
  92. }
  93. }
  94. cout << ans << Endl;
  95. }
  96. signed main()
  97. {
  98. int _;
  99. //si(_);
  100. _ = 1;
  101. init();
  102. while (_--)
  103. {
  104. slove();
  105. }
  106. return 0;
  107. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/55212
推荐阅读
相关标签
  

闽ICP备14008679号