欧拉函数:对于任意正整数N,把小于或等于N ([1,N]),且与N互质的正整数(包括1)的个数,称作对N的欧拉函数,记作φ(n)。注:互质为两者没有除1外的公因数。
规定φ(1)=1。
欧拉函数的性质:
1、若p为质数,则
2、若a为质数且a|x,则
2、若a与b互质,则
求一个数的欧拉函数值:
对一个数进行质因数分解:
由性质1可知
故代码如下:
int phi(int n) {
int res=n;
for(int i=2;i*i<=n;++i) {
if(n%i==0) res=res/i*(i-1);
while(n%i==0) n/=i;
}
if(n>1) res=res/n*(n-1);
return res;
}
与埃氏筛法相结合
int phi[maxn];
void init(int n) {
for(int i=1;i<=n;++i) phi[i]=i;
for(int i=2;i<=n;i++) {
if(phi[i]==i){
for(int j=i;j<=n;j+=i) phi[j]=phi[j]/i*(i-1);
}
}
}
与欧拉筛相结合
int phi[maxn];
int prime[maxn],cnt;
int isnp[maxn];
void init(int n) {
phi[1]=1; cnt=0;
for(int i=2;i<=n;i++)
if(!isnp[i])
prime[++cnt]=i,phi[i]=i-1;
for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
isnp[i*prime[j]]=1;
if(i%prime[j]==0) {
phi[prime[j]*i]=phi[i]*prime[j];
break;
}
else phi[prime[j]*i]=phi[i]*phi[prime[j]];
}
}