1)歐拉函數φ(n)爲所有小於n的正整數與n的GCD和,φ(n)=n*(1-1/a1)*(1-1/a2)......(a1,a2...爲n的約數)
2)若對於B有n個數與其互質,則循環到i*B則可爲pe[i*B]增加pe[B]*i
3)最後值即求a[1]+a[2]+....+a[n]
#include <stdio.h>
#include <string.h>
#define N 4000010
int pe[N];
long long num[N];
int main()
{
int n;
int i,j;
for(i=1;i<N;i++)
pe[i]=i;
memset(num,0,sizeof(num));
for(i=2;i<N;i++)
{
if(pe[i]==i)
{
for(j=1;j*i<N;j++)
pe[i*j]=pe[i*j]/i*(i-1);
}
for(j=1;j*i<N;j++)
num[i*j]+=pe[i]*j;
num[i]+=num[i-1];
}
while(scanf("%d",&n)!=-1)
{
if(n==0)
break;
printf("%lld\n",num[n]);
}
return 0;
}