1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #define M 40005 5 using namespace std; 6 int ans,n,phi[M],q[M],tot,f[M]; 7 int main() 8 { 9 scanf("%d",&n); 10 phi[1]=1; 11 for(int i=2;i<n;i++) 12 { 13 if(!f[i]) 14 { 15 tot++; 16 q[tot]=i; 17 phi[i]=i-1; 18 } 19 for(int j=1;j<=tot;j++) 20 { 21 if(q[j]*i>n) 22 break; 23 f[q[j]*i]=1; 24 if(i%q[j]) 25 phi[i*q[j]]=phi[i]*(q[j]-1); 26 else 27 phi[i*q[j]]=phi[i]*q[j]; 28 } 29 } 30 for(int i=1;i<n;i++) 31 ans+=phi[i]; 32 printf("%d\n",2*ans+1); 33 }
由题目可知 就是求互质的点对数目,如果把它按对角线分开处理,与i互质的数为phi(i),用线性筛求欧拉函数。