Min25 筛
Min25 初定义
- Min25 筛可以在 \(O(\frac{n^{\frac{3}{4}}}{\log n})\) 或 \(O(n^{1-e})\) 的复杂度下解决一类 积性函数 前缀和的问题
- 对于质数 \(p\) ,要求 \(f(p)\) 是一个关于 \(p\) 的项数较少的多项式或可以快速求值,\(f(p^c)\) 可以快速求值
- 因为多项式可以拆成若干个单项式,所以我们只需要考虑求出 \(f(p)=p^k\) 的前缀和,然后每一项加起来就行了
前置约定
-
下面若无特殊规定 \(p\) 为全体质数集合
-
设 \(minp(x)\) 表示 \(x\) 的最小质因数
-
设 \(isprime(x)\) 表示 \(x\) 是否是一个质数
-
设 \(p_k\) 表示第 \(k\) 个质数,特殊的 \(p_0=1\)
分类
- 对于质数和合数进行分类:
- 那么整个式子就变成了两个部分,第一部分是所有质数的 \(f\) 之和,另一部分是枚举最小质因子后,求所有最小质因子大于这个质因子的 \(f\) 之和
第一部分
-
我们考虑线性求出所有质数的 \(f\) 和
-
我们考虑一个 DP 的思路,设 \(g(n,i)\) ,给定 \(k\)
-
这里的 \(k\) 就是给定的低阶多项式的一项
-
注意到 \(i^k\) 是 完全积性函数
-
其实这个式子就是欧拉筛 \(k\) 轮后剩下的数的 \(k\) 次方的和
-
考虑 \(g(n,j-1)\) 怎么转移过来
-
大概即使考虑第 \(j\) 轮回筛掉哪些数,把这些数的 \(p_j\) 这个质因数拿出来,因为是完全积性函数所以是正确的
-
对于后面一项是为了将质数去掉
-
注意到 \(g(p_{j-1},j-1)\) 实际上就是前 \(j-1\) 个质数的 \(k\) 次方和
-
对于一个合数 \(x\) ,\(minp(x)\leq \sqrt n\) ,所以实际上我们需要的 \(p_j\leq \sqrt n\)
-
我们设 \(S_n=\sum_{i=1}^n p_i^k\) ,表示前 \(n\) 个质数的 \(k\) 次方和
-
\(1\) 到 \(n\) 的所有质数的 \(k\) 次方和其实就是 \(g(n,x)\) ,其中 \(p_x\) 是最后一个 \(\leq \sqrt n\) 的质数,我们记这个为 \(g(n)\)
-
我们知道一个重要的结论:
- 所以实际上我们只需要 \(O(\sqrt n)\) 个点值
求解答案
-
答案就是先求出所有质数的函数和,然后枚举一个 \(p^e\) ,再枚举最小质因子大于 \(p\) 的数
-
设 \(S(n,x)\) 表示求 \(1\) 到 \(n\) 中所有最小质因子大于 \(p_x\) 的函数值之和,可以发现答案就是 \(S(n,0)+1\)
-
我们将满足条件的数分成两部分,第一部分就是大于 \(p_x\) 的质数,也就是 \(g(n)-S(x)\) ,另一个部分就是最小质因子大于 \(p_x\) 的合数,考虑枚举最小质因子:
- 然后我们就可以递归解决这个问题了
- 这里其实就体现为什么要求 \(f(p)\) 和 \(f(p^c)\) 要可以快速求值
- 根据某玄学定理,不需要记忆化
实现细节
-
预处理出前 \(\sqrt n\) 个 \(S\) 的值
-
对于 \(\sqrt n\) 个我们可能会涉及到的点值进行编号,这里运用了一点技巧,我们将小于 \(\sqrt n\) 的用一个数组存,大于 \(\sqrt n\) 用一个数组存,当然也可以直接用
map
但是常数略大 -
然后递推求解 \(g\) 函数
-
递归求解 \(S\) 函数
- 这里以 LG P5325 【模板】Min_25筛 为例子
- 参考代码
基础例题
求莫比乌斯函数的前缀和,即 \(\sum_{i=1}^n\mu (i)\)
- 这个函数是积性函数,并且 \(f(p)=(-1),f(p^e,e\geq 2)=0\)
- 设 \(g(x)=-1\) ,这个是完全积性函数,那么 \(g(n,0)=-n+1\) ,然后预处理出前 \(\sqrt n\) 有多少个质数就可以了
求欧拉函数的前缀和,即 \(\sum_{i=1}^n \varphi(i)\)
- 这个也是积性函数,并且 \(f(p)=p-1\) ,\(f(p^e)=p^e-p^{e-1}\) ,可以快速插值
- 设 \(g(x)=x-1\) ,对于一次项 \(G1(n,0)=\frac{n(n+1)}{2}-1\),对于常数项就是 \(-n+1\) ,预处理出前 \(\sqrt n\) 个质数和和个数就可以了
- 首先这个函数是积性函数,\(f(p^c)=p\bigoplus c\) ,可以快速插值,那么就考虑质数的求法了
- \(f(p)=p\bigoplus 1\) ,预处理好说,对于 \(G(n,0)=\sum_{i=1}^n i\bigoplus 1\) 对于奇偶数分一下类就行了
进阶例题
设 \(S(n,k)\) 表示范围为 \([1,n]\) ,质数幂次和为 \(k\) 个数的个数,对于前 \(\log n\) 个 \(k\) 求 \(S(n,k)\)
- 设 \(f(x)\) 为 \(x\) 的质数幂次和,\(f(ab)=f(a)+f(b)\) ,感觉和积性函数没有半毛钱关系,但是其实满足 完全积性函数的特质 ,具体看 \(g\) 的求法
- 我们一个个分析最终的式子
- 设 \(g(n,j,k)\) ,\(n,j\) 的意义同上,质数幂次和为 \(k\) 的数的个数
- 我们仍然可以将 \(p_j\) 这一项提出来
- 对于 \(\sqrt n\) 个前缀的质数的贡献可以直接预处理出来,然后突然发现答案就是求 \(g(n,0,k)\) ,然后就没了
Min25 再定义
- 所以 Min25 筛的本质应该是它的 dp 的思想,不一定要和积性函数有关,也不一定要是低阶多项式,这也导致了它的适用性较杜教筛要广,非常的灵活
- 对于一个函数可以按照 Min25 的步骤一步步的去分析和构造辅助函数