对于正整数(n),欧拉函数是小于或等于(n)的正整数中与(n)互质的数的数目。
(varphi(1)=1),除了1之外,所有正整数与它本身都不互质
对于质数(p),(varphi(p)=p-1)
(sum_{d|n}varphi(d)=n),其中(d)是(n)的因数
欧拉函数是积性函数,若(m,n)互质,则有(varphi(mn)=varphi(m)varphi(n))
通式:(varphi(x)=xprod_{i=1}^n(1-frac{1}{p_i})) ((p_1,p_2,cdots,p_n)为(x)的所有质因数)
模板一:求单个正整数的欧拉函数
时间复杂度(O(sqrt x))
模板题:hdu1286 找新朋友
int phi(int x){
int ans=x;
for(int i=2;i*i<=x;i++){
if(n%i==0){
ans=ans/i*(i-1);
while(n%i==0){
n/=i;
}
}
}
if(n>1) ans=ans/n*(n-1);
return ans;
}
模板二:求区间内所有数的欧拉函数
时间复杂度(O(n))
模板题:hdu2824 The Euler function
const int maxn=500010;
int phi[maxn];
void get_phi(int n){
for(int i=0;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);
}
}
}