O(n)筛法

void pre(){
	vis[1]=g[1]=f[1]=mu[1]=phi[1]=d[1]=1;
	for(int i=2;i<=n;i++){
		if(!vis[i]){
			pri[++tot]=i;//质数 
			phi[i]=i-1;//欧拉函数 
			mu[i]=-1;//莫比乌斯 
			d[i]=2;//约数个数 
			num[i]=1;//最小质因子个数 
			f[i]=i+1;//约数和 
			g[i]=i+1;//最小质因子的等比数列 
		} 
		for(int j=1;j<=tot;j++){
			vis[i*pri[j]]=1;
			if(i%pri[j]==0){
				phi[i*pri[j]]=phi[i]*pri[j];
				mu[i*pri[j]]=0;
				num[i*pri[j]]=num[i]+1;
				d[i*pri[j]]=d[i]/num[i*pri[j]]*(num[i*pri[j]]+1);
				g[i*pri[j]]=g[i]*pri[j]+1;
				f[i*pri[j]]=f[i]/g[i]*g[i*pri[j]];
				break;
			}
			phi[i*pri[j]]=phi[i]*phi[pri[j]];
			mu[i*pri[j]]=-mu[i];
			d[i*pri[j]]=d[i]*2;
			num[i*pri[j]]=1;
			f[i*pri[j]]=f[i]*f[pri[j]];
			g[i*pri[j]]=pri[j]+1;
		}
	}
}
posted @ 2023-12-20 11:36  hubingshan  阅读(16)  评论(0)    收藏  举报