其实就是个中国剩余定理的模板题,因为题目没有保证模数是素数,所以用通法
直接上代码
void getphi()
{
phi[1]=1;
int i,j;
for(int i=2;i<=n;i++)
{
if(!vis[i])
{
phi[i]=i-1;
prime[++prime[0]]=i;
}
for(int j=1;j<=tot;j++)
{
if(i*prime[j]>N) break;
mark[i*prime[j]]=1;
if(i%prime[j]==0)
{
phi[i*prime[j]]=phi[i]*prime[j];//prime[j]如果为i的约数,直接退出循环,保证效率
break;
}
else
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
}