标签:
题意:
求sum{gcd(i, j) | 1 ≤ i < j ≤ n}
分析:
有这样一个很有用的结论:gcd(x, n) = i的充要条件是gcd(x/i, n/i) = 1,因此满足条件的x有phi(n/i)个,其中Phi为欧拉函数。
所以枚举i和i的倍数n,累加i * phi(n/i)即可。
1 #include <cstdio> 2 typedef long long LL; 3 4 const int maxn = 4000000; 5 6 int phi[maxn + 10]; 7 LL f[maxn + 10]; 8 9 void phi_table() 10 { 11 phi[1] = 1; 12 for(int i = 2; i <= maxn; i++) if(!phi[i]) 13 for(int j = i; j <= maxn; j += i) 14 { 15 if(!phi[j]) phi[j] = j; 16 phi[j] = phi[j] / i * (i-1); 17 } 18 } 19 20 int main() 21 { 22 phi_table(); 23 24 for(int i = 1; i <= maxn; i++) 25 for(int j = i*2; j <= maxn; j += i) 26 f[j] += i * phi[j / i]; 27 for(int i = 3; i <= maxn; i++) f[i] += f[i - 1]; 28 29 int n; 30 while(scanf("%d", &n) == 1 && n) printf("%lld\n", f[n]); 31 32 return 0; 33 }
UVa 11426 (欧拉函数 GCD之和) GCD - Extreme (II)
标签:
原文地址:http://www.cnblogs.com/AOQNRMGYXLMV/p/4320867.html