线性筛约数个数和(证明)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性筛约数个数和(证明)相关的知识,希望对你有一定的参考价值。

线性筛约数个数和(证明)

之前已经证明过了线性筛约数和,现在证这个就灰常简单了。

传送门

非常类似,也是用一个数组来维护 d ( i ) d(i) d(i)

由算术基本定理:

n = p 1 k 1 p 2 k 2 … p m k m n=p_1^{k_1}p_2^{k_2}\\dots p_{m}^{k_m} n=p1k1p2k2pmkm

d ( n ) = ( k 1 + 1 ) ( k 2 + 1 ) … ( k m + 1 ) d(n)=(k_1+1)(k_2+1)\\dots(k_m+1) d(n)=(k1+1)(k2+1)(km+1)

这里 g ( n ) = k 1 + 1 g(n)=k_1+1 g(n)=k1+1,即 n n n的最小素因子个数 + 1 +1 +1

时间复杂度: O ( n ) O(n) O(n)

ll f[N],g[N];
int cnt,vis[N],p[N];
void init(int n){
    vis[0]=vis[1]=1,f[1]=1;
    for(int i=2;i<=n;i++){
        if(!vis[i]) p[++cnt]=i,f[i]=g[i]=2;
        for(int j=1;j<=cnt&&i*p[j]<=n;j++){
            vis[i*p[j]]=1;
            if(i%p[j]==0){
                g[i*p[j]]=g[i]+1;
                f[i*p[j]]=f[i]/g[i]*g[i*p[j]];
                break;
            }
            g[i*p[j]]=2;
            f[i*p[j]]=f[i]*f[p[j]];
        }
    }
}

线筛适用于范围较小,但询问较多的题。

以上是关于线性筛约数个数和(证明)的主要内容,如果未能解决你的问题,请参考以下文章

[线性筛][筛素数/筛约数个数]

求约数个数的和

bzoj千题计划204:bzoj1968: [Ahoi2005]COMMON 约数研究(线性筛约数个数)

2019西安邀请赛B.product督教筛,推柿子,线性筛约数个数

模板 - 数论 - 线性筛

算法竞赛模板(数论)