设f(n)=gcd(1,n)+...+gcd(n-1,n),则答案所求为s(n)=f(2)+...+f(n)。
只需求得f(n).....
f(n)=sum(i*phi[n/i]);
#include<bits/stdc++.h>
using namespace std;
const int maxn=4e6+5;
typedef long long ll;
ll phi[maxn],f[maxn],s[maxn];
void euler_phi(int n){
for(int i=2;i<=n;i++)
phi[i]=0;
phi[1]=1;
for(int i=2;i<=n;i++)
if(!phi[i])
for(int j=i;j<=n;j+=i){
if(!phi[j])
phi[j]=j;
phi[j]=phi[j]/i*(i-1);
}
}
int main(){
memset(phi,0,sizeof(phi));
euler_phi(maxn);
memset(f,0,sizeof(f));
for(int i=1;i<=maxn;i++)
for(int j=i*2;j<=maxn;j+=i)
f[j]+=i*phi[j/i];
s[2]=f[2];
for(int i=3;i<=maxn;i++)
s[i]=s[i-1]+f[i];
int n;
while(~scanf("%d",&n)&&n){
printf("%lld\n",s[n]);
}
}