Min_25 筛学习笔记
感觉网上关于 Min_25 筛的讲解都不太能学懂,于是就自己写了一篇喵!
下文中,我们规定从小到大第 \(j\) 个质数为 \(p_j\)。
要使用 Min_25 筛求出一个积性函数 \(f\) 的前缀和,需要让 \(f(p)\) 为关于 \(p\) 的低阶多项式,且 \(f(p^q)\) 可以快速计算。
我们考虑从质数的幂入手。我们令 \(S_k(n)\) 表示 \(n\) 以内所有质数的 \(k\) 次方和,其中 \(k\) 是一个小常数。现在考虑如何求出 \(S_k(n)\)。
我们定义 \(S_{k,j}(n)\) 表示 \(n\) 以内所有质数以及最小质因子不小于第 \(j\) 个质数的所有合数的 \(k\) 次方和。容易发现,一个合数 \(m\) 的最小质因子不超过 \(\sqrt{m}\),所以当 \(p_j>\sqrt{n}\) 时,即 \(p_j^2>n\) 时有 \(S_{k,j}(n)=S_k(n)\)。
考虑 \(S_{k,1}(n)\),发现其应为 \(\sum\limits_{i=2}^{n} i^k\),在 \(k\) 为小常数时可以直接求出公式快速计算。现在我们考虑如何从 \(S_{k,j}(n)\) 递推得到 \(S_{k,j+1}(n)\)。
考虑最小质因子为 \(p_j\) 的合数 \(p_j \times x\),贡献为 \(p_j^k \times x^k\)。对于 \(p_j^k\) 的部分发现其为固定值,对于 \(x^k\) 的部分求和即可。发现 \(x\) 由 \(\lfloor \dfrac{n}{p_j} \rfloor\) 以内所有不小于 \(p_j\) 的质数与所有最小质因子不小于 \(p_j\) 的合数构成。可以发现此时所有 \(x^k\) 之和与 \(S_{k,j}(\lfloor \dfrac{n}{p_j} \rfloor)\) 差不多,但是需要减去所有小于 \(p_j\) 的质数的 \(k\) 次方和,只需要减去这一部分即可。
我们考虑分析上述做法的复杂度。定义 \(n\) 的整除点为能够表示成 \(\lfloor \dfrac{n}{m} \rfloor\) 的数。容易发现 \(n\) 的整除点只有 \(O(\sqrt{n})\) 个。我们发现,在计算 \(S\) 时,只要用到 \(n\) 的整除点上的 \(S\) 值,我们发现,对于 \(n\) 的整除点 \(d\),只有在 \(p_j^2 \leq d\) 时才会更新 \(S_{k,j}(d)\),所以更新 \(S_{k,j}(d)\) 的复杂度为 \(O(\pi(\sqrt{d}))\),\(\pi(n)\) 为 \(n\) 以内的质数个数,\(\pi(n)=O(\dfrac{n}{\log n})\),总复杂度为 \(O(\sum\limits_{i=1}^{\sqrt{n}} \dfrac{\sqrt{\frac{n}{i}}}{\log \sqrt{\frac{n}{i}}})\)。发现 \(i \leq \sqrt{n}\) 时有 \(\log{\sqrt{\frac{n}{i}}}=O(\log n)\),最后可得复杂度为 \(O(\dfrac{\sqrt{n}}{\log n} \times \sum\limits_{i=1}^{\sqrt{n}} \sqrt{\frac{1}{i}})=O(\dfrac{n^\frac{3}{4}}{\log n})\)。
接下来我们希望求出 \(G(n) = \sum\limits_{p \leq n} f(p)\),发现 \(G(n)\) 就是 \(S_k(n)\) 的线性组合。
最后我们需要求出 \(\sum\limits_{i=1}^n f(i)\),我们仿照上面 \(S\) 的定义给出 \(G_j(n)\)。发现 \(G_1(n)=\sum\limits_{i=2}^n f(i)\),又积性函数一定有 \(f(1)=1\),则 \(G_1(n)+1\) 为答案。又发现当 \(p_j>\sqrt{m}\) 时,即 \(p_j^2>m\) 时有 \(G_j(n)=G(n)\)。考虑从 \(G_j(n)\) 递推到 \(G_{j-1}(n)\)。
我们考虑按照上面的过程,枚举产生贡献的合数 \(p_j \times x\)。但是发现 \(p_j\) 和 \(x\) 不一定互质,不能将 \(f(p_j \times x)\) 看成 \(f(p_j) \times f(x)\)。但我们可以枚举 \(p_j\) 的次数,则产生贡献的合数可以写为 \(p_j^k \times x\),发现 \(x\) 由 \(\lfloor \dfrac{n}{p^j} \rfloor\) 以内所有大于 \(p_j\) 的质数与所有最小质因子大于 \(p_j\) 的合数构成。特别地,当 \(k>1\) 时,\(x\) 可以为 \(1\)。
先忽略 \(x=1\) 的情况,此时 \(p_j^{k+1} \leq n\),考虑 \(p_j^k \times x\) 的贡献,发现此时所有 \(f(x)\) 之和与 \(G_{j+1}(\lfloor \dfrac{n}{p_j^k} \rfloor)\) 差不多,但是需要减去所有小于等于 \(p_j\) 的质数的 \(f(p)\) 之和,只需要减去这一部分即可。
考虑 \(x=1\) 的情况,此时 \(p_j^k \leq n\),发现贡献为 \(f(p_j^k)\)。
时间复杂度分析与上面的部分差不多,我们最终得到了 \(O(\dfrac{n^\frac{3}{4}}{\log n})\) 的筛法!
还有一个小问题,我们发现如果直接存储的话空间是 \(O(n)\) 的,说明我们需要进行类似离散化的操作,把所有的整除点对应到下标上。

浙公网安备 33010602011771号