杜教筛&套路总结

杜教筛

\[ \begin{split} (g*f)(i)&=\sum_{d|i}g(d)f(\frac id)\\ \Rightarrow g(1)S(n)&=\sum_{i=1}^n(g*f)(i)-\sum_{i=2}^ng(i)S(\frac ni) \end{split} \]

其中,\(S(x)\)\(f()\)的前缀和。


套路一:\(\mu\)

\((1*\mu)=e\),取\(g(x)=1\)
\[ \begin{split} S(n)=1-\sum_{i=2}^nS(\frac ni) \end{split} \]

可以用线性筛预处理一部分\(\mu\)的前缀和,剩下的用杜教筛记忆化搜索即可。

int Smu(int x){
    if(x<=M)return mu[x];
    if(smu[x])return smu[x];
    int ret=1;
    for(int l=2,r=0;r!=x;l=r+1){
        r=x/(x/l);
        ret-=1ll*(r-l+1)*Smu(x/l);
    }
    return smu[x]=ret;
} 

例题

【CQOI2015】选数

【BZOJ3944】Sum


套路2:\(\varphi\)

\((1*\varphi)=Id\),取\(g(x)=1\)
\[ S(n)=\frac {n \cdot (n+1)}2-\sum_{i=2}^nS(\frac ni) \]

LL Sphi(int x){
    if(x<=M)return phi[x];
    if(sphi[x])return sphi[x];
    LL ret=1ll*x*(1ll*x+1)/2;
    for(int l=2,r=0;r!=x;l=r+1){
        r=x/(x/l);
        ret-=1ll*(r-l+1)*Sphi(x/l);
    }
    return sphi[x]=ret;
} 

例题

【BZOJ4805】欧拉函数求和

【BZOJ3944】Sum


其他题目:

【BZOJ4916】神犇与蒟蒻

转载于:https://www.cnblogs.com/Emiya-wjk/p/10011240.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值