欸? 我么? 我也能学会Min_25筛么?
欸? 我么? 我也能学会Min_25筛么?
前言
在 vp 2024 xcpc 昆明场的时候有一道题 \(\href{https://contest.ucup.ac/contest/1871/problem/9867/statement/zh_cn}{Flower}\)
ska_0x08 :“什么B时间复杂度, 感觉不是我们该看的东西”
SpeMars: "\(\pi\) yeah说这个很简单, 可以看一下。"
于是ska_0x08就....
前置知识
埃氏筛 (你要知道它是怎么筛的!)
求解的问题
\(\sum \limits _{i = 1} ^ {n} f(i)\)
其中 \(f(i)\) 是一个积性函数
Advantage
在 \(O (\frac{n^{\frac{3}{4}}}{\log n})\) 复杂度解决该问题
积性函数
- 完全积性函数 \(\forall a, b \in Z^*, f(ab) = f(a) * f(b)\)
- 积性函数 \(\forall a, b \in Z^* , \gcd(a, b) = 1, f(ab) = f(a) * f(b)\)
一些记号
-
\(p_k\) 第 \(k\) 小的质数 (\(p_1 = 2, p_2 = 3\))
-
lpf (\(n\)) \(n\) 的最小质因数
-
\(F_{prime}(n)\) 为 \(\sum_{2 \le p \le n}f(p)\)
解释 : 所有 质数的 贡献
-
\(F_k(n)\) 为 \(\sum _{i = 2} ^ n [p_k \le \text{lpf} (i)]f(i)\)
解释 : 所有 最小质因数 大于 \(p_k\) 的贡献
所以我们自然有 答案为
\(F_1(n) + f(1)\)
一些推导
\(F_k(n) = \sum \limits_{i = 2} ^ {n}[p_k \le \text{lpf}(i)] f(i)\)
首先最小质因数 小于 \(p_k\) 的 不会给出贡献
下考虑会给出贡献的部分
假设 \(i' = t\) 时 $p_k \le \text{lpf} (i') $
那么我们对 \(t\) 分类
一 · Case 1 : \(t\) 是一个质数
显然这部分贡献为
\(F_{prime}(n) - F_{prime}(p_{k - 1})\)
二 · Case 2 : \(t\) 为一个合数
我们不妨令
\(t = p_i^c * m\) 满足 \(\text{lpf}(t) = p_i\) 且 \(p_i \nmid m\)
观察得以下性质:
-
\(p_i \ge p_k\) 得 \(i \ge k\)
-
\(p_i ^ 2 \le t\) 而 \(t \le n\) 知 \(p_i ^2 \le n\)
解释 : 如果 \(p_i ^ 2 \ge t\) 有 \(p_i\) 为最小的质数, 又 \(t\) 为合数, 所以至少还存在一个 质数 \(p_0 > p_i\)
, 有 \(t \ge p_i * p_0 > p_i ^2 \ge t\) 矛盾 ! 所以有 \(p_i^2 \le t\)
下面 我们再对 \(m\) 分类讨论
Case 2.1 : \(m = 1\)
此时 \(t = p_i ^ c\)
直接枚举 \(p_i\) 和 \(c\)
由于性质2我们可以发现我们不用枚举 \(p_i ^ 2 \ge n\) 的部分
所以我们有求和
\(\sum _{\substack{i \ge k \\ p_i ^ 2\le n}} \sum _{\substack{c\ge2 \\ p_i ^ c \le n}} f(p_i^c)\)
-
\(i \ge k\) 由性质1 得
-
\(c \ge 2\) 是因为 \(c = 1\) 时 意味着 \(t\) 为一个素数, 我们已经处理过了
-
\(p_i ^ 2 \le n\) 由性质2 得
-
\(p_i^c \le n\) 这个太显然了吧? 我们只要统计小于 \(n\) 的答案就好啦!
最后我们将\(c\) 替换, 使得 \(c\) 从 \(1\) 开始加
\(\sum _{\substack{i \ge k \\ p_i ^ 2\le n}} \sum _{\substack{c\ge1 \\ p_i ^ {c+1} \le n}} f(p_i^{c+1})\)
Case 2.2 : m \(\ge\) 2
首先 我们思考 \(m\) 的取值范围
\(t = p_i ^ 2 · m \le n\), 也就是说 \(m \le n / p_i^c\)
由于上述我们令的条件知道
\(\text{lpf}(t) = p_i\) 且 \(p_i \nmid m\)
则知
\(\text{lpf} (m) > p_i\)
也就是说
\(\text{lpf}(m)\ge p_{i + 1}\)
那么 \(m\) 应该满足的条件就应该是
\(2 \le m \le n / p_i^c\) 且 \(\text{lpf}(m) \ge p_{i + 1}\)
我们会有
\(\sum _{\substack{m \in [2, n / p_i ^ c] \\ \text{lpf} \ge p_{i + 1}}}f(m) = \sum \limits _{m = 2}^ {n / p_i ^ c} [\text{lpf}(m) \ge p_{i + 1}]f(m) = F _{i + 1}(n / p_i ^ c)\) ——(*)
那么由积性函数我们又知
\(f(t) = f(p_i ^ c·m) = f(p_i ^c)* f(m)\) ——(**)
我们枚举 \(p_i\), \(p_i\) 的次数\(c\), 和 \(m\) , 于是我们得到 了 \(m \ge 2\) 这部分的总贡献
\(\sum _{\substack{i \ge k \\ p_i ^ 2\le n}} \sum _{\substack{c\ge1 \\ p_i ^ c \le n}} \sum _{\substack{m \in [2, n / p_i ^ c] \\ \text{lpf}(m) \ge p_{i + 1}}}f(p_i^c·m)\)
由 (**) 式代入得
\(\sum _{\substack{i \ge k \\ p_i ^ 2\le n}} \sum _{\substack{c\ge1 \\ p_i ^ c \le n}} f(p_i ^ c)\sum _{\substack{m \in [2, n / p_i ^ c] \\ \text{lpf}(m) \ge p_{i + 1}}}f(m)\)
再由 (*) 可得
\(\sum _{\substack{i \ge k \\ p_i ^ 2\le n}} \sum _{\substack{c\ge1 \\ p_i ^ c \le n}} f(p_i ^ c)F_{i + 1} (n / p_i ^ c)\)
观察一下!
当 \(n / p_i ^ c \ge p_{i + 1}\)时 \(F_{i + 1}(n / p_i ^ c)\) 才可能有值
那么 \(p_{i + 1} > p_i\)
所以我们进一步知
\(n \ge p_i ^{c + 1}\)
所以我们改写一下这个式子有
\(\sum _{\substack{i \ge k \\ p_i ^ 2\le n}} \sum _{\substack{c\ge1 \\ p_i ^ \color{red}{c+1} \le n}} f(p_i ^ {c})F_{i + 1} (n / p_i ^ c)\)
红色部分为更改部分
三 · 大合体!
我们将所有上述的分类合到一起, 我们会有
\(F_{k}(n) = \substack{F_{prime}(n) - F_{prime}(p_{k - 1}) \color{red}{Case1}\\ + \sum _\limits{\substack{i \ge k \\ p_i ^ 2\le n}} \sum\limits _{\substack{c\ge1 \\ p_i ^ {c+1} \le n}} f(p_i^{c+1})\color{red}{Case2.1}\\ + \sum \limits_{\substack{i \ge k \\ p_i ^ 2\le n}} \sum \limits_{\substack{c\ge1 \\ p_i ^ \color{red}{c+1} \le n}} f(p_i ^ {c})F_{i + 1} (n / p_i ^ c) \color{red}{Case2.2}}\)
\(Oh!\) \(No\) 这糟糕的可读性!
我们发现 对于 \(Case2.1\) 和 $Case2.2 $ 我们可以进行求和的合并, 最终写成
\(F_k(n) = F_{prime}(n) - F_{prime} + \sum \limits_{\substack{i \ge k \\ p_i ^ 2\le n}} \sum \limits_{\substack{c\ge1 \\ p_i ^ {c+1} \le n}} (f(p_i^{c+1}) + f(p_i ^ c)F_{k +1}(n / p_i ^c))\)
好的, 我们观察一下这个式子, 他是从 大到小递推的 , 别忘了, 我们的最终目的是为了求解 \(F_1(n)\) 。
考虑这个过程, 我们 要用到 \(F_{prime} (n)\) 下面我们对其进行求解。
\(四 · F_{prime} (n)\) 的求解
思考, 形如\(F_{prime}(i)\) 的式子会出现在哪里?
会出现在 \(F_{k}(i)\) 里, 也就是说, 对于等式右边 其实还暗藏着 \(F_{prime} (n / p_{i} ^ c)\)
- Note :
首先 \(n=n/1\) ,是 \(n/i\) 的形式。
递归时,第一步 \(n′=n/p_i^c\) 仍为 n/i 的形式。
后续递归中,\(n′/j=(n'/i)/j =n/(ij)\),依然是 \(n/i\) 的形式。
换句话说, 对于我们有用的 \(F_{prime}(n')\)仅仅是 形如 \(n' = n /q\) 的情况, 那么 \(n'\in\{1, 2, 3...,\sqrt{n},\frac{n}{\sqrt{n}}, ...\frac{n}{2}, n\}\)
我们考虑 求解 所有的 \(F_{prime}(n'), n'\in \{1, 2, 3...,\sqrt{n},\frac{n}{\sqrt{n}}, ...\frac{n}{2}, n\}\)
-
Note :
这里我们不妨假设 \(f(p) = \sum\limits_{i = 1} ^{r} a_ip^{ci}\)
那么
\(F_{prime}(n') = \sum\limits_{i = 1} ^ r a_i \sum\limits_{p \le n'} p^ {c_i}\)
于是我们令 \(g(p) = p^c\)
-
Notice !!!:
这么来看, 我们可以发现 \(g(x)\) 是一个完全积性函数
设 \(G_{prime}(n) = \sum\limits_{p\le n}g(p)\)
那么我们的目的转化为求解
\(G_{prime}(n)\)
五 · \(G_{prime}(n) 的 求解\)
仿照一开始求解 \(F(n)\) 的过程
我们设
\(G_k (n) = \sum\limits_{\substack{i \in [2, n] \\ \text{lpf}(i) > p_k \vee isprime(i)}} g(i)\)
这个意味着 对于 小于 \(n\) 的数, 我们只统计 质数 和 最小质因数大于 \(p_k\) 的数的贡献。
这意味着什么?
这意味着 是 埃氏筛第 k 轮筛完后剩余的数的 \(g(i)\) 之和。
由 (二)中 Case2 性质 2 知
对于合数 \(x \le n\) 有 \(\text{lpf} (x) \le \sqrt{x} \le \sqrt{n}\)
我们记 \(l(n)\) 为小于等于 \(\sqrt{n}\) 的最大质数的下标, 则 \(G_prime (n) = G_{l(n)}(n)\)。
这是因为 在埃氏筛 进行 \(l(n)\) 轮后在 \([1, n]\) 中整数只剩下质数。
-
一些小证明:
若 \(\exists p_0\) 为合数且没有被筛掉, 其中 \(p_0 \le n\)说明 \(\text{lpf}(p_0) > p_{l(n)}\) , 由于是合数, 那么它至少是两个质数之积, 但是它最小的质数都大于 \(p_{l(n)}\) , 那么我们有 \(\text{lpf}(p_0) \ge p_{l(n)+1}\) , \(p_0 \ge p_{l(n) + 1}^2\) , 不过根据定义 我们会有 $p_{l(n)+1} > \sqrt{n} $ , 换句话说, \(p_0 > n\) , 矛盾! 则结论成立!
Case 1. \(k > l(n)\)
那么我们显然可以得到, 对于 \(k > l(n)\)
我们会有 \(G_{k} (n)= G_{k + 1}(n) = G_{prime} (n)\)
- 说明
这是显然的, 因为 对于 大于 \(\sqrt{n}\) 的素数已经不会筛掉任何一个 \([1, n]\) 间的整数了。
一个简单的证明 :
如果 \(n'\) 被筛掉, \(n'\le n\)那么 \(n'\) 是一个合数且\(n'\) 在之前没有被筛掉,由于其一个质数因子 大于 \(\sqrt{n}\), 那么必存在另一个最小素数因子 \(p'\) , 有 \(p'< \sqrt{n}\) , 也就是说在 处理 \(p'\) 的时候已经 把 \(n'\) 筛掉了, 矛盾! 结论成立。
Case 2. \(k \le l(n)\)
此时 \(G_k(n)\) 等于 \(G_{k-1} (n)\) 减去这一轮筛去的 \(x\) 的 \(g(x)\) 之和
我们记 这个和 为 \(Del_k\)
\(G_k(n) = G_{k-1}(n) - Del_k\)
我们记 \(S_k\) 为所有在第 \(k\) 轮筛掉的数的集合
那么我们有
\(Del_k = \sum \limits_{x \in S_k} g(x)\)
那么我们不妨令 \(x\) 是一个被筛掉的数
由于 \(x\) 被筛去, 我们先有
\(x = p_k ·m_x \le n\) , 即 \(m_x \le n/p_k\)
由于 \(g\) 是一个完全积性函数
我们有 \(g(x) = g(p_k) · g(m_x)\)
则有
\(Del_k = g(p_k)\sum\limits_{x \in S_k} g(m_x)\)
也就是说我们只要求解
\(\sum \limits_{x \in S_k} g(m_x)\)
即可
考虑 \(m_x\) 的约束条件
1. 由于 \(\text{lpf} (x) = p_k\) 我们会有 \(\text{lpf}(m_x) \ge p_k\) 换句话说 \(\text{lpf}(m_x) > p_{k-1}\)
2. \(m_x \le n / p_k\)
\(\sum\limits_{x\in S_k} g(m_x) = \sum\limits_{\substack{m \in [2, n / p_k]\\ \text{lpf}(m) > p_{k - 1}}}g(m)\)
注意到
\(G_k (n) = \sum\limits_{\substack{i \in [2, n] \\ \text{lpf}(i) > p_k \vee isprime(i)}} g(i)\)
我们改写一下, 令 \(n\) 为 \(n/p_k\), 令 \(k\) 为 \(k - 1\)
我们会有
\(G_{\color{red}{k-1}} (\color{red}{n / p_k}) = \sum\limits_{\substack{i \in [2, \color{red}{n/p_k}] \\ \text{lpf}(i) > p_{\color{red}{k - 1}} \vee isprime(i)}} g(i)\)
比较两式, 发现区别在于 \(\vee isprime(i)\)
也就是说 \(G_{k-1} (n / p_k)\) 相比于 \(\sum\limits_{\substack{m \in [2, n / p_k]\\ \text{lpf}(m) > p_{k - 1}}}g(m)\) 仅仅只多了 小于等于 \(p_{k-1}\) 的质数部分 \(g(p)\) 的贡献。
这部分多出来的是什么, 正是 \(G_{prime} (p_{k-1})\)
于是我们有等式
\(\sum\limits_{x\in S_k} g(m_x) = \sum\limits_{\substack{m \in [2, n / p_k]\\ \text{lpf}(m) > p_{k - 1}}}g(m) = G_{k-1} (n / p_k) - G_{prime} (p_{k-1})\)
结合
\(G_k(n) = G_{k-1}(n) - Del_k\)
\(Del_k = g(p_k)\sum\limits_{x \in S_k} g(m_x)\)
我们得到
\(G_k(n) = G_{k-1}(n) - g(p_k)·(G_{k-1} (n / p_k) - G_{prime} (p_{k-1}))\)
于是我们得到了递推, 并可以以此求解 \(G_{prime} (n)\) , 并进一步得到 \(F_{prime}(n)\) , 从而得到答案。
一些Coding + 代码详解 \(\href{https://www.luogu.com.cn/problem/P5325}{P5325 【模板】Min\_25 筛}\)
ps : 等我CACC决赛比完了回来补 —— by ska_0x08 2026 4 14

浙公网安备 33010602011771号