小于n且与n互素(即两个数最大公约数为1)的整数个数,由唯一分解定理可知,从总数n中减去是p1...
pn的倍数的个数即可,此过程用到了容斥定理。容斥定理的证明自己查去..
欧拉函数:
φ(n)=n(1-1/p1)(1-1/p2)...(1-1/pk)
这个函数非常的好用
若是针对某一个数n,求他的欧拉函数
int main(){
int n;
scanf("%d",&n);
int m=(int)sqrt(n+0.5);
int ans=n;
for(int i=2;i<=m;i++)if(n%i==0)
{
ans=ans/i*(i-1);
while(n%i==0) n/=i;
}
if(n>1) ans=ans/n*(n-1);
printf("\n%d",ans);
}
若是想打表,那么类似于素数打表
原理:每次选一个素因子,直到表的尽头,使得每个有该素因子的数都除以这个素因子。
phi[1]=1;
for(int i=2;i<=n;i++){
if(!phi[i])
for(int j=i;j<=n;j+=i){
if(!phi[j])
phi[j]=j;
phi[j]=phi[j]/i*(i-1);
}
}