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 }

枚举每个质数,转化后求欧拉函数。

posted on 2016-03-22 22:54  xiyuedong  阅读(127)  评论(0编辑  收藏  举报