G=0;
for(i=1;i<N;i++)
for(j=i+1;j<=N;j++)
{
G+=gcd(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
题解
#include<stdio.h>
#define MAX_N 4000002
typedef long long LL;
int phi[MAX_N];
LL res[MAX_N],cum[MAX_N];
void init(){
for(int i=1;i<MAX_N;i++) phi[i]=i;
for(int i=2;i<MAX_N;i++)
if(phi[i]==i)
for(int j=i;j<MAX_N;j+=i)
phi[j]=phi[j]/i*(i-1);
for(int i=1;i<MAX_N;i++){
for(int k=i;k<MAX_N;k+=i){
res[k]+=1LL*i*phi[k/i];
}
}
for(int i=1;i<MAX_N;i++) res[i]-=i;
for(int i=1;i<MAX_N;i++)
cum[i]=cum[i-1]+res[i];
}
int main()
{
init();
int n;
while(scanf("%d",&n)&&n)
printf("%lld\n",cum[n]);
return 0;
}