线筛莫比乌斯函数
int prime[maxn],mu[maxn],cnt;
bool vis[maxn];
void init(){
mu[1]=1;
for(int i=2;i<maxn;i++){
if(!vis[i]){
prime[cnt++]=i;
mu[i]=-1;
}
for(int j=0;j<cnt&&i*prime[j]<maxn;j++){
vis[i*prime[j]]=true;
if(i%prime[j]) mu[i*prime[j]]=-mu[i];
else{
mu[i*prime[j]]=0;
break;
}
}
}
}
线筛欧拉函数
int prime[maxn],phi[maxn],cnt;
bool vis[maxn];
void init(){
phi[1]=1;
for(int i=2;i<maxn;i++){
if(!vis[i]){
prime[cnt++]=i;
phi[i]=i-1;
}
for(int j=0;j<cnt&&i*prime[j]<maxn;j++){
vis[i*prime[j]]=true;
if(i%prime[j]==0){
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
}
线筛因子个数
int prime[maxn],d[maxn],num[maxn];
bool vis[maxn];
int cnt;
void init(){
d[1]=1;
for(int i=2;i<maxn;i++){
if(!vis[i]){
d[i]=2;
num[i]=1;
prime[cnt++]=i;
}
for(int j=0;j<cnt&&i*prime[j]<maxn;j++){
vis[i*prime[j]]=true;
if(i%prime[j]==0){
num[i*prime[j]]=num[i]+1;
d[i*prime[j]]=d[i]/(num[i]+1)*(num[i]+2);
break;
} else {
num[i*prime[j]]=1;
d[i*prime[j]]=d[i]<<1;
}
}
}
}
线筛因子和
int prime[maxn],sum[maxn],num[maxn];
bool vis[maxn];
int cnt;
void init(){
sum[1]=num[1]=1;
for(int i=2;i<maxn;i++){
if(!vis[i]){
num[i]=sum[i]=i+1;
prime[cnt++]=i;
}
for(int j=0;j<cnt&&i*prime[j]<maxn;j++){
vis[i*prime[j]]=true;
if(i%prime[j]==0){
num[i*prime[j]]=num[i]*prime[j]+1;
sum[i*prime[j]]=sum[i]/num[i]*num[i*prime[j]];
break;
} else {
num[i*prime[j]]=prime[j]+1;
sum[i*prime[j]]=sum[i]*(prime[j]+1);
}
}
}
}
来源:https://blog.csdn.net/BX2359575459/article/details/98884355