【bzoj2190】[SDOI2008]仪仗队 数论 欧拉函数 筛法

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 }
View Code
 
原文地址:https://www.cnblogs.com/137shoebills/p/7787007.html