Min_25
引入
首先这个算法是为了解决求解积性函数求前缀和:$\sum_{i=1}^n f(i)$ 解决的。
其有两个前提:
- 所有的 $f(p)$ 必须能否被表达为一个类似 $a+bp+cp^2 \dots$。
- 所有的 $f(p^e)$ 在知道 $p,e,p^e$ 的情况下能够快速求出 $f$。
其算法的大致思路就是分成 质数 和 合数 分别解决,如下:
$$
\sum_{i=1}^{n} f(i) = \sum_{p \le n} f(i) + \sum_{p^e \le n} f(p^e) \left ( \sum_{j\le \frac{n}{p^e}, mp>p} f(j) + [e\neq1]\right)
$$
($mp$ 表示 $j$ 的最小质因子)
第一部分十分好理解;而第二部分意思就是 $p^e$ 枚举其质因子,那么合数就可以表示为 $p^e \cdot j$,当然由于 $\gcd (p^e, j)$ 必须等于 $1$,同时满足不能算重,因此需要要求 $j$ 中不能包含 $p$,相当于 $mp>p$。
因此我们分成两部分完成: 质数,合数。
质数部分
这里目前我们的目标是求出对于所有质数的前缀和,但是 $1$ ~ $n$ 的质数筛都筛不出来。
我们令 $g(i, j)$ 表示从 $1$ ~ $n$ 中所有 $x$ 满足 “$x$ 是质数 或 $x$ 的最小质因子大于 $pri_j$” 的 $x^k$ 的和。
此时这个 $x^k$ 就和质数位置的 $f$ 中的某一项相同,并且 $x^k$ 是一个完全积性函数。
那么我们尝试找出 $g(i, j)$ 和 $g(i, j-1)$ 的关系。相当与从 $g(i, j-1)$ 中取出那些最小质因子等于 $pri_j = p_j$ 的合数。
那么其实就是剔除了一个 $p_j$ 之后质因子大于等于 $p_j$ 的数。
$$
g(i, j) = g(i, j-1) - p_j ^ k \left( g(\frac{i}{p_j}, j-1) - g(pri_{j-1}, j-1) \right)
$$
(后面那个 $g$ 是为了去除所有质数)
然后后面的那个 $g$ 就相当于前 $j-1$ 个质数的 $k$ 次方和。后面命名为 $s(x)$
但是这个 $g$ 还是很大阿,首先 $j\le \sqrt i$ 因为 $p_j \le \sqrt i$(最小质因子性质),并且对于 $i$ 一直都是除去 $p$,因此其真实只有 $\sqrt n$ 个取值,可以写一个离散化。这里真实跑下来是比较快的。
此时如果距离 $\sqrt n$ 最近的 $p$ 是第 $x$ 个质数,那么 $1$ ~ $n$ 中质数 $k$ 次方前缀和就是 $g(n, x)$。
然后把每一个 $k$ 对应的 $g$ 加上系数就是真实的我们求解的前缀和,这里,命名为 $d(x) = ag_0(x) + bg_1(x) + c~g_2(x) \dots$。
合数部分
此时我们令 $S(n, x)$ 表示对于 $1$ ~ $n$ 中的数,其最小质因子大于 $pri_x$ 的函数和。
那么同样枚举最小质因子 $p$,就可以得到:
$$
S(n, x) = d(n) - s(x) + \sum_{k > x, p_k^e \le n} f(p_k^e) ~\left( S(\frac{n}{p^e}, x) + [e \neq 1] \right)
$$
这里这个 $[e \neq 1]$ 和上面相同,因为 $p^e, e>1$ 也是合数。
可以发现,$S(n, 0)$ 就是答案,递归求解即可。
代码实现
1 |
|
- 标题: Min_25
- 作者: hjm0703
- 创建于 : 2026-08-15 22:02:54
- 更新于 : 2026-08-15 22:02:54
- 链接: https://hjm-blog.de5.net/2026/08/15/min_25/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。