[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 }