欧拉函数相关
1,\(phi(i)\)表示在1到i的数中与i互质的数的个数。
2,\(O(\sqrt{n})\)求\(phi\)
算数基本定理:
\[ phi(i)=i*(p_1-1)/p_1*(p_2-1)/p_2*……*(p_k-1)/p_k \]
枚举质因数套公式即可:
code:
int phi(int x){
int re=x;
for(int i=2;i*i<=x;i++){
if(x%i==0){
re=re/i*(i-1);
while(x%i==0)x/=i;
}
}
if(x>1)re=re/x*(x-1);
return re;
}
3,线性筛欧拉函数
1,如果当前数是质数,易知:
\[ phi(i)=i-1 \]
2,如果当前数取模枚举的质数不等于零,则:
\[ phi(i*prime[j])=phi(i)*phi(prime[j]) \]
3,如果当前数取模枚举的质数等于零,则:
\[ phi(i*prime[j])=phi(i)*prime[j] \]
开始愉快地写代码:
void Euler_phi(){
memset(isprime,1,sizeof isprime);
phi[1]=1;
for(int i=2;i<=n;i++){
if(isprime[i]){
phi[i]=i-1; prime[++tot]=i;
}
for(int j=1;j<=tot&&i*prime[j]<=n;j++){
isprime[i*prime[j]]=0;
if(i%prime[j]!=0){
phi[i*prime[j]]=phi[i]*phi[prime[j]];
}
else{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
}
}
}