点击查看代码
const int maxn=2e7+100;
int n;
int p[maxn],pe[maxn],pr[maxn];
int cnt;
int d[maxn],sig[maxn],phi[maxn],mu[maxn];
void Linear_sieve(int n){
p[1]=1;
for(int i=2;i<=n;i++){
if(!p[i])p[i]=i,pe[i]=i,pr[++cnt]=i;
for(int j=1;j<=cnt&&i*pr[j]<=n;j++){
p[i*pr[j]]=pr[j];
if(p[i]==pr[j]){
pe[i*pr[j]]=pe[i]*pr[j];
break;
}
else pe[i*pr[j]]=pr[j];
}
}
d[1]=1;
for(int i=2;i<=n;i++){
if(i==pe[i]) d[i]=d[i/p[i]]+1;
else d[i]=d[i/pe[i]]*d[pe[i]];
}
sig[1]=1;
for(int i=2;i<=n;i++){
if(i==pe[i]) sig[i]=sig[i/p[i]]+i;
else sig[i]=sig[i/pe[i]]*sig[pe[i]];
}
phi[1]=1;
for(int i=2;i<=n;i++){
if(i==pe[i]) phi[i]=i/p[i]*(p[i]-1);
else phi[i]=phi[i/pe[i]]*phi[pe[i]];
}
mu[1]=1;
for(int i=2;i<=n;i++){
if(i==pe[i]){
if(i==p[i])mu[i]=-1;
else mu[i]=0;
}
else mu[i]=mu[i/pe[i]]*mu[pe[i]];
}
}