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 }
只有不断学习才能进步!