Min_25 学习小记
Part 1 介绍 Min_25 筛
Min_25筛是用来求解积性函数前缀和的一个高科技,泛用性挺强的,常数也很小,值得一学。
目前发现的使用条件大概是对于原函数 \(f\) 可以找到一个函数 \(g\) 使得两个函数素数拟合,并且 \(g\) 函数是完全积性函数,并且可以快速求前缀和,就可以使用 Min_25筛。
Part 2 算法流程
定义(素数拟合):两个函数 \(f,g\),如果任意质数 \(p\) 满足 \(f(p)=g(p)\),则称 \(f,g\) 素数拟合。
引理:合数 \(n\) 的最小质因子一定小于 \(\sqrt n\)。
则对于原函数 \(f\),我们可以构造一个函数 \(g\) 与 \(f\) 素数拟合,定义 \(Sg(n,x)\) 表示所有小于 \(n\) 的数中,是质数或最小质因数比 \(p_x\)(自然数中第 \(x\) 个质数,下文意义相同)大的 \(g\) 的和,即 \(\sum_{i \in P \vee vac_i>p_x}^n g(i)\),考虑 \(Sg(n,x)\) 从 \(x-1\) 中转移过来,其实就是减去了 最小质因数为 \(p_x\) 的贡献,简单容斥可得转移:
有了 \(Sg\) 函数过后我们将它重新转化成 \(Sf\),定义 \(Sf(n,x)\) 为 \(n\) 以内的数中,最小质因数大于 \(p_x\) 的 \(f\) 之和,即 \(\sum_{vac_i>p_x}^n f(i)\),可以将 \(Sf(n,x)\) 拆分成质数和合数两个部分,设 \(\sqrt n\) 以内有 \(cnt\) 个质数,那么质数部分的贡献显然有 \(Sg(n,cnt)-Sg(p_x,x)\),考虑合数部分,因为此时 \(f\) 不一定是完全积性函数,所以每次要把同种质因子提干净,即 \(\sum_{i=x+1}^{p_i\le \sqrt n} \sum_{c=1}^{p_i^c \le n} f(p_x^c) (Sf(\lfloor \frac{n}{p_x^c} \rfloor,x)+[c \ne 1])\),于是有了 \(Sf\) 的递推式:
最后答案是 \(Sf(n,0)\),时间复杂度是 \(O(\frac{n^{\frac{3}{4}}}{\log n})\)。
Part 3 实现细节
所有形如 \(Sg(p_x,x)\) 的函数都可以预处理质数表的函数前缀和。
\(Sg\) 函数的 \(n\) 过大,所以在 \(n\) 小时存储在下标 \(n\) 上,否则一定能写成 \(\lfloor \frac{N}{i} \rfloor\) 的形式,记录在下标 \(i\) 就行了,因此数组开两倍空间。
\(Sf\) 递推式中 \(p_i \le \sqrt n\) 的原因正是因为引理中最小质因数一定小于根号。(主要是怕自己忘了或者脑袋抽风突然理解不了)。

浙公网安备 33010602011771号