欧拉函数
来自:http://blog.csdn.net/leolin_/article/details/6642096
欧拉函数是指:对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) 。
通式:φ(x)=x*(1-1/p1)*(1-1/p2)*(1-1/p3)*(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数,x是不为0的整数。φ(1)=1(唯一和1互质的数就是1本身)。
对于质数p,φ(p) = p - 1。注意φ(1)=1.
欧拉定理:对于互质的正整数a和n,有aφ(n) ≡ 1 mod n。
欧拉函数是积性函数——若m,n互质,φ(mn)=φ(m)φ(n)。
若n是质数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟n互质。
特殊性质:当n为奇数时,φ(2n)=φ(n)
欧拉公式的延伸:一个数的所有质因子之和是euler(n)*n/2。
可以在筛法求素数时同时计算欧拉函数:
(codevs 2269 仪仗队)
#include<iostream> #include<cstring> #define Size 40005 using namespace std; int n; int prime[Size],phi[Size]; bool bo[Size]; void getphi(){ memset(bo,true,sizeof(bo)); int tot=0; phi[1]=1; for(int i=2;i<=n;i++){ if(bo[i]){ prime[++tot]=i; phi[i]=i-1; } for(int j=1;j<=tot;j++){ if(i*prime[j]>n)break; bo[i*prime[j]]=false; if(i%prime[j]==0){ phi[i*prime[j]]=phi[i]*prime[j]; break; }else phi[i*prime[j]]=phi[i]*(prime[j]-1); } } } int main(){ cin>>n; getphi(); int ans=0; for(int i=1;i<n;i++){ ans+=phi[i]; } ans=ans*2+1; cout<<ans<<endl; return 0; }