埃氏筛法求欧拉函数
void euler(int n)
{
for (int i=1;i<=n;i++) phi[i]=i;
for (int i=2;i<=n;i++)
{
if (phi[i]==i)//这代表i是质数
{
for (int j=i;j<=n;j+=i)
{
phi[j]=phi[j]/i*(i-1);//把i的倍数更新掉
}
}
}
}
埃氏筛法的效率比较慢,所以这里贴一种欧拉筛求欧拉函数的代码
int cnt=0;
void f(int n)
{
phi[1]=1;
for(int i=2;i<=n;i++)
{
if(!ok[i])
{
p[++cnt]=i;
phi[i]=i-1;
}
for(int j=1;j<=cnt;j++)
{
if(i*p[j]>n)
break;
ok[i*p[j]]=1;
if(i%p[j]==0)
{
phi[i*p[j]]=phi[i]*p[j];
break;
}
else
phi[i*p[j]]=phi[i]*phi[p[j]];
}
}
}