Min_25 筛
Min_25 筛
终于把这个坑补上了
前言
Min_25 筛是由 Min_25 发明的一种亚线性筛法,用于解决如下问题:
其中 \(f(i)\) 是积性函数,而且要满足如下要求:
- \(f(p)\) 可以表示为完全积性函数的和(如关于 \(p\) 的多项式)
- \(f(p^k)\) 易求
Part 1
先考虑一个简单的问题:如何快速求 \(\pi(n)\)?Min_25 筛采用了埃氏筛法的思想来解决。
我们设 \(G(n,i)\) 表示第 \(i\) 轮埃筛结束后 \(2 \sim n\) 中剩下的数的个数,其中 \(G(n,0) = n-1\)。设 \(m\) 为 \(\sqrt{n}\) 范围内质数的个数,答案即为 \(G(n,m)\)。
我们可以采用递推的思想解决该问题。在第 \(i-1\) 埃筛轮结束后,最小质因数为前 \(i-1\) 个质数的合数都已经被筛除,接下来我们考虑在此基础上刨除最小质因数为第 \(i\) 个质数的合数。显然这些合数不能含有前 \(i-1\) 个质数,且必须是第 \(i\) 个质数的倍数,那么这些合数的数量就是 \(G(\lfloor \frac{n}{p_i} \rfloor,i-1) - (i-1)\),后面减去的部分是因为我们把没有筛掉的前 \(i-1\) 个质数算了进来,而他们的最小质因数不是第 \(i\) 个质数。所以最终的递推式就是:
通过枚举 \(i\) 的方式可以滚动数组将空间复杂度做到 \(O(\sqrt{n})\),这样直接枚举的时间复杂度为 \(O(\frac{n^{\frac{3}{4}}}{\log n})\)。(你觉得我像是会证这个时间复杂度的吗?)
事实上该方法可以推广至算完全积性函数 \(f\) 在质数点的权值和,递推式为:
Part 2
现在我们回归原问题,求积性函数的前缀和:
这里我们考虑设 \(S(n,i)\) 表示在 \(2 \sim n\) 中最小质因数大于 \(p_i\) 的数的 \(f\) 值之和,并规定 \(p_0 = 1\),则答案即为 \(S(n,0) + f(1)\),因为我们没算到 \(1\) 处的取值。然后 \(S(n,i)\) 也可以递推:
这里相当于枚举一个数的最小质因数及其次数。然后可以发现当 \(p_j > \sqrt{n}\) 时,\(k \leq 1\),所以我们考虑将质数处的点值单独提出来,即:
然后对于前半部分:
可以发现递归过程中 \(p_i^2 > n\) 时不会进入后面的递归,所以积性函数在质数处的取值和也是好算的。
综上,我们解决的了积性函数的前缀和问题,时间复杂度为 \(O(n^{1 - \epsilon})\)(还是不会分析),但是实测跑得还是比较快的。

浙公网安备 33010602011771号