http://www.lydsy.com/JudgeOnline/problem.php?id=2190
裸欧拉函数,先不计算对角线(a,a)的一列,然后算出1到n-1的所有欧拉函数相加*2,再加上对角线能看到的1个即可。
欧拉函数:φ(x)表示xy互质且y<x的y的个数.
筛法求解,
φ(x)是积性函数满足
1.当x与y互质时φ(x*y)=φ(x)*φ(y).
2.x为质数时,φ(x)=x-1;
3.x%y=0时,φ(x*y)=φ(x)*y.
代码
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 const int maxn=50100; 8 int n; 9 int cnt[maxn]={}; 10 int su[maxn]={},tot=0; 11 bool vis[maxn]={}; 12 int main(){ 13 scanf("%d",&n);cnt[1]=1; 14 for(int i=2;i<=n;i++){ 15 if(!vis[i])su[++tot]=i,cnt[i]=i-1; 16 for(int j=1;j<=tot;j++){ 17 if(i*su[j]>n)break; 18 vis[i*su[j]]=1; 19 if(i%su[j]==0){cnt[i*su[j]]=cnt[i]*su[j]; break;} 20 cnt[i*su[j]]=cnt[i]*cnt[su[j]]; 21 } 22 }int ans=0; 23 for(int i=1;i<n;i++){ 24 ans+=cnt[i]; 25 } 26 printf("%d ",ans*2+1); 27 return 0; 28 }