Min_25 筛

Min_25 筛

终于把这个坑补上了

前言

Min_25 筛是由 Min_25 发明的一种亚线性筛法,用于解决如下问题:

\[\sum\limits_{i=0}^{n} f(i) \]

其中 \(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\) 个质数。所以最终的递推式就是:

\[G(n,i) = G(n,i-1) - G(\lfloor \frac{n}{p_i} \rfloor,i-1) + i-1 \]

通过枚举 \(i\) 的方式可以滚动数组将空间复杂度做到 \(O(\sqrt{n})\),这样直接枚举的时间复杂度为 \(O(\frac{n^{\frac{3}{4}}}{\log n})\)。(你觉得我像是会证这个时间复杂度的吗?

事实上该方法可以推广至算完全积性函数 \(f\) 在质数点的权值和,递推式为:

\[G(n,i) = G(n,i-1) - f(p_i) (G(\lfloor \frac{n}{p_i} \rfloor,i-1) - \sum\limits_{j=1}^{i-1} f(p_j)) \]

Part 2

现在我们回归原问题,求积性函数的前缀和:

\[\sum\limits_{i=1}^{n} f(i) \]

这里我们考虑设 \(S(n,i)\) 表示在 \(2 \sim n\) 中最小质因数大于 \(p_i\) 的数的 \(f\) 值之和,并规定 \(p_0 = 1\),则答案即为 \(S(n,0) + f(1)\),因为我们没算到 \(1\) 处的取值。然后 \(S(n,i)\) 也可以递推:

\[S(n,i) = \sum\limits_{j>i} \sum\limits_{k \geq 1 \land p_j^k \leq n} f(p_j^k)(S(\lfloor \frac{n}{p_j^k} \rfloor,j) + 1) \]

这里相当于枚举一个数的最小质因数及其次数。然后可以发现当 \(p_j > \sqrt{n}\) 时,\(k \leq 1\),所以我们考虑将质数处的点值单独提出来,即:

\[S(n,i) = \sum\limits_{j>i \land p_j \leq n} f(p_j) + \sum\limits_{j>i \land p_j^2 \leq n} \sum\limits_{k \geq 1 \land p_j^k \leq n} f(p_j^k)(S(\lfloor \frac{n}{p_j^k} \rfloor,j) + [k \neq 1]) \]

然后对于前半部分:

\[\sum\limits_{j>i \land p_j \leq n} f(p_j) = G(n,m) - \sum\limits_{j=1}^{i} f(p_j) \]

可以发现递归过程中 \(p_i^2 > n\) 时不会进入后面的递归,所以积性函数在质数处的取值和也是好算的。

综上,我们解决的了积性函数的前缀和问题,时间复杂度为 \(O(n^{1 - \epsilon})\)还是不会分析),但是实测跑得还是比较快的。

posted @ 2025-04-28 20:59  gevenfeng  阅读(22)  评论(0)    收藏  举报