【转】线性筛约数个数和、约数和
click here
当然如果复杂度允许的话还是用埃氏筛吧
下面给个模板:
约数个数和
\(O(nlogn)\)
go(i,1,n)
for(int j=i;j<=n;j+=i)
++d[j];
约数和
\(O(nlogn)\)
go(i,1,n)
for(int j=i;j<=n;j+=i)
sd[j]+=i;
\(O(n)\)
sd[1]=1;
go(i,2,n){
if(!vis[i]) p[++tot]=i,num[i]=sd[i]=i+1;
for(int j=1;j<=tot&&p[j]*i<=n;++j){
vis[p[j]*i]=1;
if(i%p[j]==0){
sd[p[j]*i]=sd[i]/num[i]*(num[i]*p[j]+1);
num[p[j]*i]=num[i]*p[j]+1;
break;
}
else{
sd[p[j]*i]=sd[i]*sd[p[j]];
num[p[j]*i]=p[j]+1;
}
}
}