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

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

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

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

限制的意思是(ib<=n),再化简
=nb=1g(b)sum(f(1..n/b))=∑b=1ng(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))=sum(f(1..n))+∑b=2ng(b)sum(f(1..n/b))

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

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

这就是最终的结果了owo

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值