作用与使用前提
对一个积性函数(f),我们要求(f)的前(n)项和(S_n),并且要求在比线性复杂度更低的复杂度情况下求出
若有数论函数(g,h),满足
(h=f*g)
其中(*)为狄利克雷卷积
并且(h)的前缀非常好求,(g)的单项非常好求,我们就可以快速的求出(f)的前缀和
求法
先看(f,g,h)的关系
(egin{aligned}h(n)=sum_{d|n}f(frac{n}{d})g(d)end{aligned})
我们对(h)求前缀和,则有
(egin{aligned}sum ^{n}_{i=1}hleft( i
ight) &=sum ^{n}_{i=1}fast gleft( i
ight)\
&=sum ^{n}_{i=1}sum _{dli}fleft( dfrac {n}{a}
ight) gleft( d
ight) \
&=sum ^{n}_{d=1}gleft( d
ight) sum ^{frac {n}{d}}_{i=1}fleft( i
ight) \
&=sum ^{n}_{d=1}gleft( d
ight) S_{frac {n}{d}}\
\ end{aligned})
接下来我们把(d=1)的情况单独提出来
(egin{aligned}sum ^{n}_{i=1}hleft( i ight) &=g(1)S_n+sum ^{n}_{d=2}gleft( d ight) S_{frac {n}{d}}end{aligned})
再把(S_n)写到左边
(egin{aligned}S_{n}=dfrac {left( sum ^{n}_{i=1}hleft( i
ight)
ight) -left( sum ^{n}_{i=2}gleft( i
ight) S _frac {n}{i}
ight) }{gleft( 1
ight) }end{aligned})
对一般的数论函数(g),通常(g(1)=1),于是我们可以把(g(1))省掉,得到
(egin{aligned}S_{n}=left( sum ^{n}_{i=1}hleft( i
ight)
ight) -left( sum ^{n}_{i=2}gleft( i
ight) S_ frac {n}{i}
ight) end{aligned})
于是我们可以先预处理出来(S_1,S_2,cdots S_m),(m)取一个较大的数,如(10^6)
之后我们可以通过记忆化搜索的方法来求解(S_n)
举例
(mu)
我们要求(mu)的前缀和,即(f=mu)
我们知道(I=xi*mu)
其中(xi(n)=1,I(n)=[n=1])
那么
(egin{aligned}S_{mu(n)}&=left( sum ^{n}_{i=1}Ileft( i
ight)
ight) -left( sum ^{n}_{i=2}xileft( i
ight) S _{mu(frac {n}{i})}
ight) \
&=1 - sum ^{n}_{i=2} S _{mu(frac {n}{i})}\
end{aligned})
(varphi)
或者要求(varphi)的前缀和,即(f=varphi)
我们知道(varphi)的一条性质
(egin{aligned}n=sum _{d|n}varphi left( d
ight)end{aligned})
然后我们知道一个数论函数(id)并且(id(n)=n)
于是这条性质我们也可以写成
(id=varphi*xi)
我们再套上面的公式,即可得到
(egin{aligned}S_{varphi(n)}&=left( sum ^{n}_{i=1}idleft( i
ight)
ight) -left( sum ^{n}_{i=2}xileft( i
ight) S _{varphi(frac {n}{i})}
ight) \
&=dfrac{nleft(1+n
ight)}{2} - sum ^{n}_{i=2} S _{varphi(frac {n}{i})}
end{aligned})
如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧