线筛各种函数 元函数 恒等函数 单位函数 莫比乌斯函数 欧拉函数 因子个数函数 因子和函数
#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=1e6+10; int e[maxn]; int I[maxn]; int ID[maxn]; int phi[maxn]; int mu[maxn]; void init_e() { e[1]=1; } void init_I() { int n=maxn-1; for(int i=1;i<=n;i++) I[i]=1;} void init_ID(){ int n=maxn-1; for(int i=1;i<=n;i++) ID[i]=i;} bool vis[maxn]; int prime[maxn/7]; int tot=0; void init_mu(){ int n=maxn-1; tot=0; mu[1]=1; for(int i=2;i<=n;i++){ if(vis[i]==0) { prime[++tot]=i; mu[i]=-1; } for(int j=1;j<=tot && i*prime[j]<=n;j++){ vis[i*prime[j]]=1; if(i%prime[j]==0){break;} mu[i*prime[j]]=-mu[i]; } } } void init_phi(){ int n=maxn-1; tot=0; phi[1]=1; for(int i=2;i<=n;i++){ if(vis[i]==0) { prime[++tot]=i; phi[i]=i-1; } for(int j=1;j<=tot && i*prime[j]<=n;j++){ vis[i*prime[j]]=1; if(i%prime[j]==0){ phi[i*prime[j]]=phi[i]*prime[j]; break; }phi[i*prime[j]]=phi[i]*(prime[j]-1); } } } int d[maxn]; ll dd[maxn]; int mm[maxn]; // 最小因子相关的信息 void init_d(){ int n=maxn-1; tot=0; d[1]=1; for(int i=2;i<=n;i++){ if(vis[i]==0) {prime[++tot]=i; d[i]=2; mm[i]=2; } for(int j=1;j<=tot && i*prime[j]<=n;j++){ vis[i*prime[j]]=1; if(i%prime[j]==0){ d[i*prime[j]]=d[i]/mm[i]*(mm[i]+1); mm[i*prime[j]]=mm[i]+1; break; } d[i*prime[j]]=d[i]*2; mm[i*prime[j]]=2; } } } // ((x+1)*x+1)*x+1; // 转换成多项式 类似hash void init_dd(){ int n=maxn-1; tot=0; dd[1]=1; for(int i=2;i<=n;i++){ if(vis[i]==0) { prime[++tot]=i; dd[i]=i+1; mm[i]=i+1; } for(int j=1;j<=tot && i*prime[j]<=n;j++){ vis[i*prime[j]]=1; if(i%prime[j]==0){ mm[i*prime[j]]=mm[i]*prime[j]+1; dd[i*prime[j]]=dd[i]/mm[i]*mm[i*prime[j]] ; break; } dd[i*prime[j]]=dd[i]*dd[prime[j]]; mm[i*prime[j]]=1+prime[j]; } } } int main(){ init_e();init_I();init_ID(); init_mu();init_phi();init_d();init_dd(); }