求欧拉函数
定义
图白嫖huge的

求单个
int euler_phi(int n)
{
int ans=n;
for (int i=2;i*i<=n;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;
}
求多个
const int maxn=3e6+10;
int phi[maxn];
int prime[maxn];
bool is_no_p[maxn]={1,1};
void Phi(int n)
{
phi[1]=1;
for (int i=2;i<=n;i++)
{
if (!is_no_p[i])
{
prime[++prime[0]]=i;
phi[i]=i-1;
}
for (int j=1;j<=prime[0] && i*prime[j]<=n;j++)
{
is_no_p[i*prime[j]]=1;
if (i%prime[j] == 0)
{
phi[i*prime[j]]=prime[j]*phi[i];
break;
}
else
{
phi[i*prime[j]]=(prime[j]-1)*phi[i];
}
}
}
}

浙公网安备 33010602011771号