约数个数
#define N 1000001 bool vis[N]; int prime[N]; int t[N],e[N]; // 前n个约数个数之和 void init() { int cnt=0; t[1]=1; for(int i=2;i<=n;++i) { if(!vis[i]) { prime[++cnt]=i; t[i]=2; e[i]=1; } for(int j=1;j<=cnt;++j) { if(i*prime[j]>n) break; vis[i*prime[j]]=true; if(i%prime[j]==0) { t[i*prime[j]]=t[i]/(e[i]+1)*(e[i]+2); e[i*prime[j]]=e[i]+1; break; } else { t[i*prime[j]]=t[i]*2; e[i*prime[j]]=1; } } } }