欸? 我么? 我也能学会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\)

​ 观察得以下性质:

  1. \(p_i \ge p_k\)\(i \ge k\)

  2. \(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

posted @ 2026-04-15 00:13  ska_0x08  阅读(10)  评论(0)    收藏  举报