欧拉函数表示小于等于n且与n互质的数的数量
直接求,用到了容斥定理:先求一个数的质因数分解
int phi(int x) { int ans=x; for(int i=2;i*i<=x;i++) { if(x%i==0) { ans=ans/i*(i-1); while(x%i==0) { x/=i; } } } if(x>1) { ans=ans/x*(x-1); } return ans; }
打表法:类似于线性筛法。。
int phi[N],prime[N]; int tot=0; void euler() { phi[1]=1; for(int i=2;i<N;i++) { if(!phi[i])//如果p为质数,phi[p]=p-1; { phi[i]=i-1; prime[tot++]=i; } for(int j=0;j<tot&&1ll*i*prime[j]<N;j++) { if(i%prime[j])//如果p为质数,i%p==0,phi[i*p]=phi[i]*p; { phi[i*prime[j]]=phi[i]*(prime[j]-1); } else//如果p为质数,i%p!=0,phi[i*p]=phi[i]*(p-1); { phi[i*prime[j]]=phi[i]*prime[j]; break; } } } }