杜教筛

也许更好的阅读体验

作用与使用前提

对一个积性函数 f f f,我们要求 f f f的前 n n n项和 S n S_n Sn,并且要求在比线性复杂度更低的复杂度情况下求出
若有数论函数 g , h g,h g,h,满足
h = f g h=f*g h=fg
其中 * 为狄利克雷卷积
并且 h h h的前缀非常好求, g g g的单项非常好求,我们就可以快速的求出 f f f的前缀和


求法

先看 f , g , h f,g,h f,g,h的关系
<mstyle displaystyle="true" scriptlevel="0"> h ( n ) = <munder> d n </munder> f ( n d ) g ( d ) </mstyle> \begin{aligned}h(n)=\sum_{d|n}f(\frac{n}{d})g(d)\end{aligned} h(n)=dnf(dn)g(d)
我们把对 h h h求前缀和,则有
<mstyle displaystyle="true" scriptlevel="0"> <munderover> i = 1 n </munderover> h ( i ) </mstyle> <mstyle displaystyle="true" scriptlevel="0"> = <munderover> i = 1 n </munderover> f g ( i ) </mstyle> <mstyle displaystyle="true" scriptlevel="0"> </mstyle> <mstyle displaystyle="true" scriptlevel="0"> = <munderover> i = 1 n </munderover> <munder> d l i </munder> f ( n a ) g ( d ) </mstyle> <mstyle displaystyle="true" scriptlevel="0"> </mstyle> <mstyle displaystyle="true" scriptlevel="0"> = <munderover> d = 1 n </munderover> g ( d ) <munderover> i = 1 n d </munderover> f ( i ) </mstyle> <mstyle displaystyle="true" scriptlevel="0"> </mstyle> <mstyle displaystyle="true" scriptlevel="0"> = <munderover> d = 1 n </munderover> g ( d ) S n d </mstyle> <mstyle displaystyle="true" scriptlevel="0"> </mstyle> \begin{aligned}\sum ^{n}_{i=1}h\left( i\right) &amp;=\sum ^{n}_{i=1}f\ast g\left( i\right)\\ &amp;=\sum ^{n}_{i=1}\sum _{dli}f\left( \dfrac {n}{a}\right) g\left( d\right) \\ &amp;=\sum ^{n}_{d=1}g\left( d\right) \sum ^{\frac {n}{d}}_{i=1}f\left( i\right) \\ &amp;=\sum ^{n}_{d=1}g\left( d\right) S_{\frac {n}{d}}\\ \\ \end{aligned} i=1nh(i)=i=1nfg(i)=i=1ndlif(an)g(d)=d=1ng(d)i=1dnf(i)=d=1ng(d)Sdn
接下来我们把 d = 1 d=1 d=1的情况单独提出来

<mstyle displaystyle="true" scriptlevel="0"> <munderover> i = 1 n </munderover> h ( i ) </mstyle> <mstyle displaystyle="true" scriptlevel="0"> = g ( 1 ) S n + <munderover> d = 2 n </munderover> g ( d ) S n d </mstyle> \begin{aligned}\sum ^{n}_{i=1}h\left( i\right) &amp;=g(1)S_n+\sum ^{n}_{d=2}g\left( d\right) S_{\frac {n}{d}}\end{aligned} i=1nh(i)=g(1)Sn+d=2ng(d)Sdn

再把 S n S_n Sn写到左边
<mstyle displaystyle="true" scriptlevel="0"> S n = ( <munderover> i = 1 n </munderover> h ( i ) ) ( <munderover> i = 2 n </munderover> g ( i ) S n i ) g ( 1 ) </mstyle> \begin{aligned}S_{n}=\dfrac {\left( \sum ^{n}_{i=1}h\left( i\right) \right) -\left( \sum ^{n}_{i=2}g\left( i\right) S _\frac {n}{i}\right) }{g\left( 1\right) }\end{aligned} Sn=g(1)(i=1nh(i))(i=2ng(i)Sin)
对一般的数论函数 g g g,通常 g ( 1 ) = 1 g(1)=1 g(1)=1,于是我们可以把 g ( 1 ) g(1) g(1)省掉,得到
<mstyle displaystyle="true" scriptlevel="0"> S n = ( <munderover> i = 1 n </munderover> h ( i ) ) ( <munderover> i = 2 n </munderover> g ( i ) S n i ) </mstyle> \begin{aligned}S_{n}=\left( \sum ^{n}_{i=1}h\left( i\right) \right) -\left( \sum ^{n}_{i=2}g\left( i\right) S_ \frac {n}{i}\right) \end{aligned} Sn=(i=1nh(i))(i=2ng(i)Sin)

于是我们可以先预处理出来 S 1 , S 2 , S m S_1,S_2,\cdots S_m S1,S2,Sm m m m取一个较大的数,如 1 0 6 10^6 106
之后我们可以通过记忆化搜索的方法来求解 S n S_n Sn


举例

μ \mu μ

我们要求 μ \mu μ的前缀和,即 f = μ f=\mu f=μ
我们知道 I = ξ μ I=\xi*\mu I=ξμ
其中 ξ ( n ) = 1 , I ( n ) = [ n = 1 ] \xi(n)=1,I(n)=[n=1] ξ(n)=1,I(n)=[n=1]
那么
<mstyle displaystyle="true" scriptlevel="0"> S μ ( n ) </mstyle> <mstyle displaystyle="true" scriptlevel="0"> = ( <munderover> i = 1 n </munderover> I ( i ) ) ( <munderover> i = 2 n </munderover> ξ ( i ) S μ ( n i ) ) </mstyle> <mstyle displaystyle="true" scriptlevel="0"> </mstyle> <mstyle displaystyle="true" scriptlevel="0"> = 1 <munderover> i = 2 n </munderover> S μ ( n i ) </mstyle> \begin{aligned}S_{\mu(n)}&amp;=\left( \sum ^{n}_{i=1}I\left( i\right) \right) -\left( \sum ^{n}_{i=2}\xi\left( i\right) S _{\mu(\frac {n}{i})}\right) \\ &amp;=1 - \sum ^{n}_{i=2} S _{\mu(\frac {n}{i})}\\ \end{aligned} Sμ(n)=(i=1nI(i))(i=2nξ(i)Sμ(in))=1i=2nSμ(in)

φ \varphi φ

或者要求 φ \varphi φ的前缀和,即 f = φ f=\varphi f=φ
我们知道 φ \varphi φ的一条性质
<mstyle displaystyle="true" scriptlevel="0"> n = <munder> d n </munder> φ ( d ) </mstyle> \begin{aligned}n=\sum _{d|n}\varphi \left( d\right)\end{aligned} n=dnφ(d)
然后我们知道一个数论函数 i d id id并且 i d ( n ) = n id(n)=n id(n)=n
于是这条性质我们也可以写成
i d = φ ξ id=\varphi*\xi id=φξ
我们再套上面的公式,即可得到
<mstyle displaystyle="true" scriptlevel="0"> S φ ( n ) </mstyle> <mstyle displaystyle="true" scriptlevel="0"> = ( <munderover> i = 1 n </munderover> i d ( i ) ) ( <munderover> i = 2 n </munderover> ξ ( i ) S φ ( n i ) ) </mstyle> <mstyle displaystyle="true" scriptlevel="0"> </mstyle> <mstyle displaystyle="true" scriptlevel="0"> = n ( 1 + n ) 2 <munderover> i = 2 n </munderover> S φ ( n i ) </mstyle> \begin{aligned}S_{\varphi(n)}&amp;=\left( \sum ^{n}_{i=1}id\left( i\right) \right) -\left( \sum ^{n}_{i=2}\xi\left( i\right) S _{\varphi(\frac {n}{i})}\right) \\ &amp;=\dfrac{n\left(1+n\right)}{2} - \sum ^{n}_{i=2} S _{\varphi(\frac {n}{i})} \end{aligned} Sφ(n)=(i=1nid(i))(i=2nξ(i)Sφ(in))=2n(1+n)i=2nSφ(in)

如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧

全部评论

相关推荐

点赞 评论 收藏
分享
10-15 09:13
已编辑
天津大学 soc前端设计
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务