Given the value of N, you will have to find the value of G. The definition of G is given below:
Here GCD(i, j) means the greatest common divisor of integer i and integer j.
For those who have trouble understanding summation notation, the meaning of G is given in the
following code:
G=0;
for(i=1;i<N;i++)
for(j=i+1;j<=N;j++)
{
G+=gcd(i,j);
}(i < j)
/*Here gcd() is a function that finds
the greatest common divisor of the two
input numbers*/
Input
The input file contains at most 100 lines of inputs. Each line contains an integer N (1 < N < 4000001).
The meaning of N is given in the problem statement. Input is terminated by a line containing a single
zero.
Output
For each line of input produce one line of output This line contains the value of G for the corresponding N.
The value of G will fit in a 64-bit signed integer.
Sample Input
10
100
200000
0
Sample Output
67
13015
143295493160
题目大意:就是求G[n]#include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<algorithm> using namespace std; const int N = 4000010; typedef long long ll; ll a[N], b[N], G[N]; int main() { ll n; for(ll i = 0 ; i < N ; i++) a[i] = i;//初始化 a[1] = 1; for(ll i = 2 ; i < N ; i++) { if(a[i] == i) { a[i] -= a[i] / i; for(ll j = i * 2 ; j < N ; j += i) a[j] -= a[j] / i; } }//欧拉函数打表 for(ll i = 1 ; i < N ; i++) { for(ll j = i * 2 ; j < N ; j += i) b[j] += a[j / i] * i; }//b[n]打表(这里b的下标应含因子i) G[2] = 1; for(ll i = 3 ; i < N ; i++) G[i] = G[i - 1] + b[i];//G[n]打表 while(scanf("%lld", &n), n) { printf("%lld ", G[n]); } return 0; }