[bzoj2818]Gcd

线性筛素数。然后递推搞。

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <cstdlib>
 6 using namespace std;
 7 
 8 
 9 const int N=10000010;
10 bool v[N];
11 int prime[N],pTot,n;
12 int phi[N];
13 long long ans,f[N];
14 
15 int main(){
16     scanf("%d",&n);
17     for(int i=(f[1]=phi[1]=1)+1;i<=n;i++){
18         if(!v[i])prime[++pTot]=(phi[i]=i-1)+1;
19         for(int j=1;j<=pTot&&i*prime[j]<=n;j++){
20             v[i*prime[j]]=1;
21             if(i%prime[j]==0){
22                 phi[i*prime[j]]=phi[i]*prime[j];break;
23             }else phi[i*prime[j]]=phi[i]*(prime[j]-1);
24         }
25         f[i]=f[i-1]+phi[i];
26     }
27     for(int i=1;i<=pTot;i++)ans+=f[n/prime[i]];
28     printf("%lld\n",ans*2-pTot);
29 }
View Code

 

posted @ 2017-01-29 09:55  KingSann  阅读(85)  评论(0)    收藏  举报