1 #include<cstdio> 2 #include<iostream> 3 #define M 10000009 4 #define ll long long 5 int tot,zhan[M],n,f[M]; 6 ll sum[M],ans; 7 void ou() 8 { 9 sum[1]=1; 10 for(int i=2;i<=n;i++) 11 { 12 if(!f[i]) 13 { 14 sum[i]=i-1; 15 zhan[++tot]=i; 16 } 17 for(int j=1;j<=tot;j++) 18 { 19 if(zhan[j]*i>n) 20 break; 21 f[zhan[j]*i]=1; 22 if(i%zhan[j]) 23 sum[i*zhan[j]]=sum[i]*sum[zhan[j]]; 24 else 25 sum[i*zhan[j]]=sum[i]*zhan[j]; 26 } 27 } 28 return; 29 } 30 int main() 31 { 32 scanf("%d",&n); 33 ou(); 34 for(int i=1;i<=n;i++) 35 sum[i]+=sum[i-1]; 36 for(int i=1;i<=tot;i++) 37 ans+=2*sum[n/zhan[i]]-1; 38 printf("%lld\n",ans); 39 return 0; 40 }
枚举每个质数,转化后求欧拉函数。