Min25筛
博客两年没更了,其实博主有在打 ACM,但是因为平时用 Latex 而不是 Markdown 所以就算写了点东西也懒得搬,最近准备搬点知识点总结过来,为了防止比赛撞板子就不放代码了
用途
求积性函数 \(f\) 的前缀和 \(F(n)=\sum_n^{i=1} f(i)\).
复杂度 \(O(\frac{n^{\frac{3}{4}}}{\log{n}})\) (或者 \(O(n^{1-\epsilon})\), 存在 \(O(n^{\frac{2}{3}})\) 的树状数组优化版本, 但常数巨大)
使用条件
- \(f(p)\) 是低次多项式(感觉是完全积性函数的线性组合就行?)
- \(f(p^e)\) 可以快速求出
原理
Part 1
对于完全积性函数 \(f_k(i)=i^k\), 求解 \(\sum_{p_i \le n} f_k(p_i)\), 其中 \(p_i\) 是第 \(i\) 小的质数.
通过埃氏筛的方式只留下合法位置, 这样质数只需要筛到 \(\sqrt{n}\) 就可以把合数位置全部去除.
设 \(g_k(n,i)\) 为用前 \(i\) 个质数做埃氏筛, 前 \(n\) 个数剩余合法位置的 \(f_k\) 的和, 即
其中, \(MinP(j)\) 为 \(j\) 的最小质因数.
考虑埃氏筛的过程:
首先, \(1\) 从一开始就被筛去, 因此 \(g_k(n,0) = \sum_{i=2}^{n} f_k(p_i)\), 即自然数幂和减 \(1\).
接下来每个数被其最小质因数筛去.
记 \(\sum_{j=1}^{i-1}f_k(p_i)\) 为 \(sp_k(i-1)\), 可以线性筛预处理.
根据这个式子可以dp, 但时间和空间复杂度都不能接受.
可以注意到,第 \(i\) 次筛后的 \(g\) 数组是由第 \(i-1\) 次筛后的 \(g\) 数组转移而来, 且转移点 \(\lfloor \frac{n}{p_i} \rfloor < n\), 所以可以直接省掉一维.
注意到每次转移点都是 \(\lfloor \frac{n}{x} \rfloor\) 的形式,
由于 \(\lfloor \frac{\lfloor \frac{n}{a} \rfloor}{b} \rfloor = \lfloor \frac{n}{ab} \rfloor\),
所以为了求 \(g_k(n,i)\) 实际需要用到的位置不超过 \(2\sqrt{n}\) 个.
将这 \(2\sqrt{n}\) 个位置拼成一个数组, 只计算这些位置的值, 看起来就非常优秀了.
由于对于 \(g_k(n,\infty)\), 只需要枚举不超过 \(\sqrt{n}\) 的质数, 总复杂度为:
这样,就对所有 \(m = \lfloor \frac{n}{x} \rfloor\) 的位置都求出了\(\sum_{p_i \le m} f_k(p_i)\), 如果\(f(i)\)只在质数位置不为\(0\)(如求质数个数等, 就已经做完了).
Part 2
接下来求解 \(\sum_{i=1}^{n}f(i)\), 设:
所求即为 \(S(n,0)+1\).
分别考虑质数和合数位置对 \(S(n,i)\) 的贡献:
-
对质数位置, \(f(i)\) 是低次多项式, \(i^k\)的贡献为 \(g_k(n,\infty)-sp_k(i)\), 容易算出总贡献.
-
对合数位置, 需要枚举其最小质因子及其次数, 根据积性函数的性质知道,贡献为:
似乎因为某些深刻的原因(好像是只会每个位置访问一次)直接递归计算就行, 复杂度是 \(O(n^{1-\epsilon})\) 的, 但常数巨小, 在\(n \le 10^{13}\)时和\(O(\frac{n^{\frac{3}{4}}}{\log{n}})\)等数量级.
如果也写成dp递推就同样是 \(O(\frac{n^{\frac{3}{4}}}{\log{n}})\) 的.