杜教筛如何推式子/堆柿子

来源:互联网 发布:mysql 时间戳 编辑:程序博客网 时间:2024/04/29 22:35

对于求数论函数f的1..n前缀和,可以找另一个好求前缀和的函数g,配成狄利克雷卷积。
首先你要有一个好求的狄利克雷卷积前缀和类似
ni=1(gf)(i),这个东西要能高效率求,不妨设为H以便下文理解
(因为就像一个常数,不需要参与化简)。

然后我们考虑将其化简,目的是变出个sum(f(1..n)),然后将剩下的一大堆好求的东西移到另外一边去。
=ni=1j|if(j)g(ij)

想要不走弯路化简,则先枚举另外函数自变量b,再枚举被求函数f的自变量i ,以便配出sum(f(1..n))的形式(即上式中的i=下式中的bi)
=nb=1i=n/bi=1f(i)g(b)

限制的意思是(ib<=n),再化简
=nb=1g(b)sum(f(1..n/b))

很好,出现了一个可以分块的n/b.
看到没有,当b取1的时候我们所求sum(f(1..n))就出现了,将他拿出来。
=sum(f(1..n))+nb=2g(b)sum(f(1..n/b))

整理一下我们的成果
H=sum(f(1..n))+nb=2g(b)sum(f(1..n/b))

移项得出最后的式子
sum(f(1..n))=Hnb=2g(b)sum(f(1..n/b))

这就是最终的结果了owo

因为我们一开始选用的函数g的前缀和就可以高效率求,

复杂度是T(n)=ni=2T()

该分块的分块,再加上记忆化sum(i),达到O(n3/4)的复杂度。

只要预处理n的2/3次方的sum(i) (证明???),复杂度可以进一步优化成O(n2/3)的复杂度。