UVa 11426 (欧拉函数 GCD之和) GCD - Extreme (II)

题意:

求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 }
代码君

 

posted @ 2015-03-07 20:25  AOQNRMGYXLMV  阅读(435)  评论(0编辑  收藏  举报