欧拉函数

''' c++
/线性筛O(n)时间复杂度内筛出maxn内欧拉函数值/
int m[maxn],phi[maxn],p[maxn],pt;//m[i]是i的最小素因数,p是素数,pt是素数个数

int make()
{
phi[1]=1;
int N=maxn;
int k;
for(int i=2;i<N;i++)
{
if(!m[i])//i是素数
p[pt++]=m[i]=i,phi[i]=i-1; // 素数的欧拉函数值是它自己减一
for(int j=0;j<pt&&(k=p[j]i)<N;j++)
{
m[k]=p[j]; // 任何i的质数p[j]倍的最小素因数是p[j]
if(m[i]==p[j]) //为了保证以后的数不被再筛,要break
{
phi[k]=phi[i]
p[j]; // 魔法的事情出现了,当一个数i的最小素因数是素数pj时,ipj的欧拉函数值是i的欧拉函数值乘pj-1
/
这里的phi[k]与phi[i]后面的∏(p[i]-1)/p[i]都一样(m[i]==p[j])只差一个p[j],就可以保证∏(p[i]-1)/p[i]前面也一样了/
break;
}
else
phi[k]=phi[i]
(p[j]-1);//积性函数性质,f(ik)=f(i)f(k)
}
}
}
'''

原文地址:https://www.cnblogs.com/MisTariano/p/7811986.html