常用的素数、欧拉、莫比乌斯
const int N=5e6+9;
int mu[N],phi[N],su[N],vis[N],num;
void init()
{
mu[1]=1,phi[1]=1;
for(int i=2;i<N;++i){
if(!vis[i])su[++num]=i,mu[i]=-1,phi[i]=i-1;
for(int j=1;j<=num&&i*su[j]<N;++j){
vis[i*su[j]]=1;
if(i%su[j]==0){
phi[i*su[j]]=phi[i]*su[j];
break;
}
mu[i*su[j]]=-mu[i];
phi[i*su[j]]=phi[i]*phi[su[j]];
}
}
}
单个欧拉
int phi(int n)
{
int ans=n;
for(int i=2;i*i<=n;++i){
if(n%i==0){
ans-=ans/i;
while(n%i==0)n/=i;
}
}
if(n>1)ans-=ans/n;
return ans;
}
单个莫比乌斯
int mu(int n)
{
int ans=1;
for(int i=2;i*i<=n;++i){
if(n%i==0){
n/=i;
ans*=-1;
if(n%i==0)return 0;
}
}
if(n!=1)ans*=-1;
return ans;
}