【转】线性筛约数个数和、约数和

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;
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/White-star/p/11518405.html