UVA 11426 GCD - Extreme (II)(数论)
2020-02-03 19:28
78 查看
题目是给出N,求G的值。
可以转化为S(n) = f(1) + f(2) + f(3) + ... + f(n)。其中f(n) = gcd(1, n) + gcd(2, n) + ... + gcd(n, n)。
随便写一个n = 5 的情况。得到gcd(1, 5) = 1, gcd(2, 5) = 1, gcd(3, 5) = 1, gcd(4, 5) = 1, gcd(5, 5) = 5。
所以当f(5) = 1 * 4 + 5 * 1 = 9。显然我们可以根据公约数的值来计算f(n)的值。设gcd(x, n) = i, 可以得到gcd(x / i, n / i) = 1。也就是(x / i)与(n / i)互质,可以通过欧拉函数来计算(x / i)的数量。为了提高效率,可以枚举约束i,再枚举i的倍数n在线性时间内进行预处理
#include<bits/stdc++.h> using namespace std; const int maxn = 4000010; #define ll long long int phi[maxn]; ll s[maxn], f[maxn]; void phi_table(int n) { memset(phi, 0, sizeof(phi)); phi[1] = 1; for(int i = 2; i <= n; i++) if(!phi[i]) for(int j = i; j <= n; j += i) { if(!phi[j]) phi[j] = j; phi[j] = phi[j] / i * (i - 1); } } int main() { phi_table(maxn); memset(f, 0, sizeof(f)); for(int i = 1; i <= maxn; i++) for(int n = i * 2; n <= maxn; n += i) f += i * phi[n/i]; s[2] = f[2]; for(int n = 3; n <= maxn; n++) s = s[n-1] + f ; int n; while(~scanf("%d", &n)) { if(n == 0) break; cout << s << endl; } }
转载于:https://www.cnblogs.com/lonewanderer/p/5705218.html
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- UVA 11426 - GCD - Extreme (II) (数论)
- GCD - Extreme (II) UVA - 11426 (数论,gcd,欧拉函数)题解
- Uva 11426 GCD - Extreme (II)(基本数论)
- UVA 11426 - GCD - Extreme (II) (数论)
- UVA 11426 GCD - Extreme (II) (数论|欧拉函数)
- UVA 11426 GCD - Extreme (II) (数论|欧拉函数)
- [UVa 11426] GCD - Extreme (II) (数论 + 脑洞 + 技巧)
- UVA 11426 - GCD - Extreme (II) (数论)
- uva 11426 - GCD - Extreme (II)(数论)
- uva 11426 GCD - Extreme (II)
- UVA11426 GCD - Extreme (II)
- UVA 11426 - GCD Extreme(II)
- UVA - 11426 GCD - Extreme (II) (欧拉函数)
- UVA - 11426 GCD - Extreme (II)
- UVa11426 - GCD - Extreme (II)(欧拉函数的妙用)
- UVa 11426 - GCD - Extreme (II) (数学 欧拉函数)
- UVA:11426 GCD - Extreme (II)
- UVA 11426 GCD - Extreme (II) (欧拉函数)
- UVa 11426题解 GCD - Extreme (II) 题解
- GCD - Extreme (II) UVA - 11426 (欧拉函数)