[线筛五连]线筛约数个数

伪模板链接:https://www.luogu.org/problemnew/show/P3327

线筛约数个数

约数个数的定义

为了格式,写了个这玩意儿。。。

这定义应该很清楚了,写个式子吧。。。

σ0(x)=d|x1 σ 0 ( x ) = ∑ d | x 1

约数个数的性质

x=pa11pa22...pann x = p 1 a 1 p 2 a 2 . . . p n a n

那么有个大家耳熟能详的公式:

σ0(x)=(a1+1)(a2+1)...(an+1) σ 0 ( x ) = ( a 1 + 1 ) ( a 2 + 1 ) . . . ( a n + 1 )

那么 σ0(x) σ 0 ( x ) 的积性也是很显然的,博主就懒得证了。。。

这玩意儿仍然能跟数列求和扯上关系,放到后面讲。

约数个数的线筛

为了筛这玩意儿,我们还需要开另外一个数组 num[i] n u m [ i ] ,记录 i i 的最小质因数的指数,之所以记录这个,是因为线筛有一个非常好的性质:每个数只会被它的最小质因数筛去

T=i×p[j],接下来考虑线筛:

1.当 T T 为质数时,显然T只有两个约数, 1 1 和它自己,最小质因数也只有它自己一个,所以此时σ0(T)=2,num[i]=1

2.当 T T 拥有多个最小质因子(即i mod p[j]=0)时,那么 T T 就比i多了一个最小质因子,根据上面的公式就有 σ0(T)=σ0(i)×num[i]+2num[i]+1 σ 0 ( T ) = σ 0 ( i ) × n u m [ i ] + 2 n u m [ i ] + 1

3.当 T T 的最小质因子只有一个(即i mod p[j]0)时, T T i多了一个新的质因子,就有 σ0(T)=2σ0(i) σ 0 ( T ) = 2 σ 0 ( i )

综上:

σ0(x)=2σ0(i)×num[i]+2num[i]+12σ(i)TPrimei mod p[j]=0i mod p[j]0 σ 0 ( x ) = { 2 T ∈ P r i m e σ 0 ( i ) × n u m [ i ] + 2 n u m [ i ] + 1 i   m o d   p [ j ] = 0 2 σ ( i ) i   m o d   p [ j ] ≠ 0

代码
void get()
{
    R i,j,t;
    miu[1]=d[1]=check[1]=1;
    for(i=2;i<=N;++i)
    {
        if(!check[i])miu[i]=-1,d[i]=2,num[i]=1,p[++p[0]]=i;
        for(j=1;j<=p[0];++j)
        {
            t=i*p[j];if(t>N)break;
            check[t]=1;
            if(i%p[j]==0){miu[t]=0;num[t]=num[i]+1;d[t]=d[i]/(num[i]+1)*(num[i]+2);break;}
            miu[t]=-miu[i],num[t]=1,d[t]=d[i]<<1;
        }
        d[i]+=d[i-1],miu[i]+=miu[i-1];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShadyPi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值