顾名思义,这是\(min25dalao\)发明的算法,可以用来处理一些积性函数求和的问题。
- 用途
我们现在有一个积性函数\(F(x)\),要我们快速计算前缀和,即求
\[\sum_{i=1}^{n} F(i)
\]
-
前置知识
数论函数基本性质,比较基础就不说了... -
使用前提
\(1.\forall p \in prime F(p)\)是一个低阶多项式
\(2.\forall p \in prime,k \in N^* F(p^k)\)可以快速求出
(条件说实话还是比较严苛的...) -
解决问题
我们明确了一些大前提,那么到底该怎么实现呢?
首先将和式拆开,即分成
\[\sum_{p \in prime} F(p) + \sum_{i \notin prime} F(i)
\]
先考虑前半部分,也就是所有质数上的值。
- \(step 1\) 求解质数
考虑构造一个完全积性函数\(F'(x)\),使得\(\forall p \in prime,F'(p)=F(p)\)
那么我们只要求出\(F'(x)\)在所有质数上的值即可
这里我们运用\(DP\)的思想,设
\[g(n,m)=\sum_{i=1}^{n} F'(i)[i \in prime | minp(i)>p_m]
\]
那么可以得到转移
\[g(n,m)=\begin{cases}
g(n,m-1)&p_m>\sqrt{n}\\
g(n,m-1)-F'(p_m)[g(\frac{n}{p_m},m-1)-g(p_m-1,m-1)]&p_m \leq \sqrt{n}
\end{cases}
\]
我们设\(k = max\){\(k|p_k\leq\sqrt{n}\)}
则答案显然为\(g(n,k)\)
这样前半部分就结束了,我们接下来考虑求解整个函数。
- \(step 2\) 求解答案
我们可以考虑和求质数的值一样的方法,设
\[S(n,m)=\sum_{i=1}^{n}F(i)[minp(i)>p_m]
\]
那么可以得到转移
\[S(n,m)=g(n,k)-\sum_{i=1}^{m-1}F(p_i)+\sum_{i>m} \sum_{e} F(p_i^e)(S(\frac{n}{p_i^e},i)+[e>1])
\]
这样我们就做完了。
-
参考资料
yyb的博客
GuessYCB的博客