码迷,mamicode.com
首页 > 其他好文 > 详细

杜教筛&套路总结

时间:2018-11-24 14:05:56      阅读:314      评论:0      收藏:0      [点我收藏+]

标签:class   求和   .com   欧拉   zoj   var   rac   spl   cpp   

杜教筛

\[ \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

杜教筛&套路总结

标签:class   求和   .com   欧拉   zoj   var   rac   spl   cpp   

原文地址:https://www.cnblogs.com/Emiya-wjk/p/10011240.html

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!