wenbao与数论(大白书)

最大公约数之和

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=26&problem=2421&mosmsg=Submission+received+with+ID+18788108

输入n 输出gcd(i,j) 1<=i<j<=n总和

1 #include <iostream>
 2 using namespace std;
 3 #define REP(i, x, n) for(int i = x; i < n; i++)
 4 #define ll long long
 5 const int maxn = 4000005;
 6 int phi[maxn], p[maxn];
 7 ll f[maxn], s[maxn];
 8 bool vis[maxn];
 9 void Euler(int n){
10     int i, j, k, cnt = 0;
11     phi[1] = 1;
12     for (i = 2; i < n; ++i){
13         if (!vis[i]){
14             p[cnt++] = i;
15             phi[i] = i - 1;
16         }
17         for (j = 0; j < cnt && i * p[j] < n; ++j){
18             vis[i * p[j]] = true;
19             if (i % p[j]) phi[i * p[j]] = phi[i] * phi[p[j]];
20             else {
21                 phi[i * p[j]] = phi[i] * p[j];
22                 break;
23             }
24         }
25     }
26 }
27 int main(){
28     Euler(maxn);
29     REP(i, 1, maxn){
30         for(int j = i*2; j < maxn; j += i){
31             f[j] += i * phi[j/i]; 
32         }
33     }
34     s[2] = f[2];
35     REP(i, 3, maxn) s[i] = s[i-1] + f[i];
36     int n;
37     while(scanf("%d", &n) && n){
38         printf("%lld\n", s[n]);
39     }
40     return 0;
41 }

只有不断学习才能进步!