[线筛五连]线筛约数和

没做到过要用这玩意儿的。。。

线筛约数和

约数和的定义

定义如它的名字所示,表达式如下:

σ1(x)=d|xdσ1(x)=∑d|xd
约数和的性质

根据算术基本定理,计算约数和有个公式,设x=pa11pa22...pannx=p1a1p2a2...pnan,那么有:

σ1(x)=(1+p1+p21+...+pa11)(1+p2+p22+...+pa22)...(1+pn+p2n+...+pann)σ1(x)=(1+p1+p12+...+p1a1)(1+p2+p22+...+p2a2)...(1+pn+pn2+...+pnan)

积性也很好证,两个互质的数拥有两个不同的质因数集合,根据上面的公式,显然是可以直接乘起来的。

其他的性质因为没用过,也不太了解。。。

约数和的线筛

按照惯例,设T=i×p[j]T=i×p[j]

根据线筛σ0(x)σ0(x)的套路,我们也开一个数组prod[i]prod[i]表示以11为首项,i的最小质因数为公比,项数为ii的最小质因数的指数的等比数列的和。

1.当T为素数时,TT的因数只有1和它本身,所以σ1(T)=prod[i]=T+1σ1(T)=prod[i]=T+1

2.当TT拥有多个最小质因子(即i mod p[j]=0)时,因为p[j]p[j]ii的最小质因子,那么Tii相比,就是在1+p[j]+p[j]2+...+p[j]n这个等比数列里比ii多了一个p[j]n+1,所以有:prod[T]=prod[i]×p[j]+1,σ1(T)=σ1(i)×prod[T]prod[i]prod[T]=prod[i]×p[j]+1,σ1(T)=σ1(i)×prod[T]prod[i]

3.当TT的最小质因子都只有一个(即i mod p[j]0)时,p[j]p[j]TT的最小质因子,所以有prod[T]=p[j]+1,σ1(T)=σ(i)×(p[j]+1);

综上:

σ1(T)=T+1σ1(i)×prod[T]prod[i]σ1(T)=σ(i)×(p[j]+1)TPrimei mod p[j]=0i mod p[j]0σ1(T)={T+1T∈Primeσ1(i)×prod[T]prod[i]i mod p[j]=0σ1(T)=σ(i)×(p[j]+1)i mod p[j]≠0
代码
void get()
{
    R i,j,t;
    check[1]=prod[1]=sumd[1]=1;
    for(i=2;i<=N;++i)
    {
        if(!check[i])prod[i]=sumd[i]=1+i,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){prod[t]=prod[i]*p[j]+1;sumd[t]=sumd[i]/prod[i]*prod[t];break;}
            prod[t]=p[j]+1,sumd[t]=sumd[i]*(p[j]+1);
        }
        sumd[i]+=sumd[i-1];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ShadyPi

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

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

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

打赏作者

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

抵扣说明:

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

余额充值