杜教筛

也许更好的阅读体验

作用与使用前提

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


求法

先看\(f,g,h\)的关系
\(\begin{aligned}h(n)=\sum_{d|n}f(\frac{n}{d})g(d)\end{aligned}\)
我们对\(h\)求前缀和,则有
\(\begin{aligned}\sum ^{n}_{i=1}h\left( i\right) &=\sum ^{n}_{i=1}f\ast g\left( i\right)\\ &=\sum ^{n}_{i=1}\sum _{dli}f\left( \dfrac {n}{a}\right) g\left( d\right) \\ &=\sum ^{n}_{d=1}g\left( d\right) \sum ^{\frac {n}{d}}_{i=1}f\left( i\right) \\ &=\sum ^{n}_{d=1}g\left( d\right) S_{\frac {n}{d}}\\ \\ \end{aligned}\)
接下来我们把\(d=1\)的情况单独提出来

\(\begin{aligned}\sum ^{n}_{i=1}h\left( i\right) &=g(1)S_n+\sum ^{n}_{d=2}g\left( d\right) S_{\frac {n}{d}}\end{aligned}\)

再把\(S_n\)写到左边
\(\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}\)
对一般的数论函数\(g\),通常\(g(1)=1\),于是我们可以把\(g(1)\)省掉,得到
\(\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}\)

于是我们可以先预处理出来\(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]\)
那么
\(\begin{aligned}S_{\mu(n)}&=\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) \\ &=1 - \sum ^{n}_{i=2} S _{\mu(\frac {n}{i})}\\ \end{aligned}\)

\(\varphi\)

或者要求\(\varphi\)的前缀和,即\(f=\varphi\)
我们知道\(\varphi\)的一条性质
\(\begin{aligned}n=\sum _{d|n}\varphi \left( d\right)\end{aligned}\)
然后我们知道一个数论函数\(id\)并且\(id(n)=n\)
于是这条性质我们也可以写成
\(id=\varphi*\xi\)
我们再套上面的公式,即可得到
\(\begin{aligned}S_{\varphi(n)}&=\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) \\ &=\dfrac{n\left(1+n\right)}{2} - \sum ^{n}_{i=2} S _{\varphi(\frac {n}{i})} \end{aligned}\)

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

你可能感兴趣的:(杜教筛)