也许更好的阅读体验
作用与使用前提
对一个积性函数 f,我们要求 f的前 n项和 Sn,并且要求在比线性复杂度更低的复杂度情况下求出
若有数论函数 g,h,满足
h=f∗g
其中 ∗为狄利克雷卷积
并且 h的前缀非常好求, g的单项非常好求,我们就可以快速的求出 f的前缀和
求法
先看 f,g,h的关系
h(n)=d∣n∑f(dn)g(d)
我们把对 h求前缀和,则有
i=1∑nh(i)=i=1∑nf∗g(i)=i=1∑ndli∑f(an)g(d)=d=1∑ng(d)i=1∑dnf(i)=d=1∑ng(d)Sdn
接下来我们把 d=1的情况单独提出来
i=1∑nh(i)=g(1)Sn+d=2∑ng(d)Sdn
再把 Sn写到左边
Sn=g(1)(∑i=1nh(i))−(∑i=2ng(i)Sin)
对一般的数论函数 g,通常 g(1)=1,于是我们可以把 g(1)省掉,得到
Sn=(i=1∑nh(i))−(i=2∑ng(i)Sin)
于是我们可以先预处理出来 S1,S2,⋯Sm, m取一个较大的数,如 106
之后我们可以通过记忆化搜索的方法来求解 Sn
举例
μ
我们要求 μ的前缀和,即 f=μ
我们知道 I=ξ∗μ
其中 ξ(n)=1,I(n)=[n=1]
那么
Sμ(n)=(i=1∑nI(i))−(i=2∑nξ(i)Sμ(in))=1−i=2∑nSμ(in)
φ
或者要求 φ的前缀和,即 f=φ
我们知道 φ的一条性质
n=d∣n∑φ(d)
然后我们知道一个数论函数 id并且 id(n)=n
于是这条性质我们也可以写成
id=φ∗ξ
我们再套上面的公式,即可得到
Sφ(n)=(i=1∑nid(i))−(i=2∑nξ(i)Sφ(in))=2n(1+n)−i=2∑nSφ(in)
如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧