杜教筛
前置知识:积性函数的狄利克雷卷积:
$$ \mu * 1 = \epsilon \\ \varphi * 1 = \operatorname{id} $$求 $F(n) = \sum\limits_{i=1}^{n} f(i)$,其中 $f$ 为积性函数。
构造积性函数 $g$ 和 $h$ 使得 $h = f * g$ 且容易求出 $g$ 和 $h$ 的前缀和。
对于 $f = \mu$,构造 $g = 1,\ h = \epsilon$。 对于 $f = \varphi$,构造 $g = 1,\ h = \operatorname{id}$。
推导过程如下:
$$ \begin{aligned} \sum_{i=1}^{n} h(i) =& \sum_{i=1}^{n} \sum_{d|i} g(d)f(\frac{i}{d}) \\ =& \sum_{d=1}^{n} \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} g(d)f(i) \\ =& \sum_{d=1}^{n} g(d)F(\lfloor \frac{n}{d} \rfloor) \end{aligned} $$$$ F(n) = \frac{1}{g(1)}\left(\sum_{i=1}^{n} h(i) - \sum_{i=2}^{n} g(i)F(\lfloor \frac{n}{i} \rfloor)\right) $$由于 $g$ 为积性函数,所以 $g(1) = 1$。
使用数论分块并递归求解 $\sum\limits_{i=2}^{n} g(i)F(\lfloor \frac{n}{i} \rfloor)$,直接计算复杂度为 $\mathcal O(n^{\frac{3}{4}})$,若使用线性筛预处理出前 $n^{\frac{2}{3}}$ 项并使用 unordered_map 进行记忆化可以做到 $\mathcal O(n^{\frac{2}{3}})$。
复杂度证明
考虑 $g$ 和 $h$ 的前缀和可以 $\mathcal O(1)$ 计算的情况。设 $T(n)$ 为计算 $F(n)$ 的时间复杂度,有
$$ \begin{aligned} T(n) =& \Theta(\sqrt n) + \sum_{i=2}^{\sqrt n} \left(T(i) + T\left(\frac{n}{i}\right)\right) \\ =& \Theta(\sqrt n) + \sum_{i=2}^{\sqrt n} \left( \Theta(\sqrt i) + \Theta(\sqrt{\lfloor \frac{n}{i} \rfloor }) \right) \end{aligned} $$将 $T(n)$ 展开一层即可,因为有 $\lfloor \frac{\lfloor \frac{n}{x} \rfloor}{y} \rfloor = \lfloor \frac{n}{xy} \rfloor$,所以再展开就会被记忆化。
$$ \begin{aligned} &\because \Theta(\sqrt i) + \Theta(\sqrt{\lfloor \frac{n}{i} \rfloor}) \ge 2 \sqrt{\sqrt n} = 2n^{\frac{1}{4}} \\ &\therefore \sqrt n \left(\Theta(\sqrt i) + \Theta(\sqrt{\lfloor \frac{n}{i} \rfloor}) \right) \ge 2n^{\frac{3}{4}} \end{aligned} $$假设使用线性筛预处理了前 $k$ 个前缀和,且 $k \ge \sqrt n$,则
$$ T(n) = \sum_{i=2}^{\frac{n}{k}} \Theta(\sqrt{\lfloor \frac{n}{i} \rfloor}) = \Theta(n^{\frac{2}{3}}),\square $$数论分块套杜教筛
若在杜教筛外面套一次数论分块,时间复杂度仍为 $\mathcal O(n^\frac{2}{3})$,因为若事先计算一次 $F(n)$,且使用线性筛优化以及 unordered_map 等进行记忆化,则数论分块过程中用到的 $F(\lfloor \frac{n}{d} \rfloor)$ 都已经被记忆化。
Powerful Number 筛 (PN 筛)
同样是求积性函数 $f$ 的前缀和 $F(n) = \sum\limits_{i=1}^{n} f(i)$。
需要构造积性函数 $g$ 使得对于任意质数 $p$ 有 $f(p) = g(p)$,且 $g$ 易求前缀和。
Powerful Number
定义:对于 $n$ 的质因数分解 $n = \prod p_i^{k_i}$,$n$ 为 PN 当且仅当 $\forall i, k_i > 1$。
性质 1:所有 PN 都能表示为 $a^2b^3$。
证明 1:若 $k_i$ 为偶数则直接用 $p_i^{k_i}$ 对 $a^2$ 贡献,若 $k_i$ 为奇数则先对 $b^3$ 进行 $p_i^3$ 的贡献,然后对 $a^2$ 产生 $p_i^{k_i-3}$ 的贡献。
性质 2:$n$ 以内的 PN 最多有 $\mathcal O(\sqrt n)$ 个。
证明 2:枚举 $a$ 后,考虑满足条件的 $b$ 的个数,所以个数约为
$$ \int_{1}^{\sqrt n} \sqrt[3]{\frac{n}{x^2}} \mathrm{d}x = O(\sqrt n) $$要求出 $n$ 以内的 PN,只需要先线性筛出 $\sqrt n$ 以内的质数,再 DFS 搜索出各质数的指数即可,复杂度还是 $\mathcal O(\sqrt n)$。
PN 筛
构造积性函数 $g$ 使得对于任意质数 $p$ 都满足 $f(p) = g(p)$,记 $G(n) = \sum\limits_{i=1}^{n} g(i)$。
构造函数 $h = f / g$,由狄利克雷卷积的性质可知 $h$ 为积性函数,$h(1) = 1$ 且 $f = g * h$。
对于素数 $p$,有 $f(p) = g(1)h(p) + g(p)h(1) = g(p) + h(p)$,又因为 $f(p) = g(p)$,所以 $h(p) = 0$。又由于 $h$ 为积性函数,故 $h(n)$ 只在 $n$ 为 PN 时不为 $0$。
根据 $f = g * h$,有
$$ \begin{aligned} F(n) =& \sum_{i=1}^{n} f(i) \\ =& \sum_{i=1}^{n} \sum_{d | i} h(d) g(\frac{i}{d}) \\ =& \sum_{d=1}^{n} h(d) \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} g(i) \\ =& \sum_{d=1}^{n} h(d) G(\lfloor \frac{n}{d} \rfloor) \\ =& \sum_{\substack{d=1\\d\text{ is PN}}}^{n} h(d) G(\lfloor \frac{n}{d} \rfloor) \\ \end{aligned} $$下面考虑如何计算出 $h(n)$。算出所有 $h(p^c)$ 的值即可直接推导。根据 $f = g * h$ 有 $f(p^c) = \sum\limits_{i=0}^{c} g(p^i) h(p^{c-i})$,移项得到 $h(p^c) = f(p^c) - \sum\limits_{i=1}^{c} g(p^i)h(p^{c-i})$,先对于每个质数 $p$ 处理出所有 $h(p^c)$,之后在 DFS 处理所有 PN 的时候推导出所有的 $h(n)$。
复杂度证明
线性筛预处理 $\sqrt n$ 以内的质数,并对每个质数预处理 $h(p^c)$,时间复杂度为 $\mathcal O(\frac{\sqrt n}{\log n} \log^2 n) = O(\sqrt n \log n)$,空间复杂度为 $\mathcal O(\sqrt n)$。
对于计算过程中的时间复杂度,假设可以 $\mathcal O(1)$ 求出 $G(\lfloor \frac{n}{d} \rfloor)$,则显然为 $\mathcal O(\sqrt n)$。若使用杜教筛求出 $G(\lfloor \frac{n}{d} \rfloor)$,则时间复杂度为 $\mathcal O(n^\frac{2}{3})$,证明如下(其实与数论分块套杜教筛的复杂度证明相同):
若事先计算一次 $G(n)$,且使用线性筛优化以及
unordered_map等进行记忆化,则 PN 筛过程中用到的 $G(\lfloor \frac{n}{d} \rfloor)$ 都已经被记忆化。
综上所述,若可以 $\mathcal O(1)$ 求出 $G(n)$,则 PN 筛的时间复杂度为 $\mathcal O(\sqrt n \log n)$,否则使用杜教筛求出 $G(n)$ 则时间复杂度为 $\mathcal O(n^\frac{2}{3})$。空间复杂度均为 $\mathcal O(\sqrt n)$。
Min_25 筛
同样是计算积性函数 $f$ 的前缀和。要求 $f(p)$ 和 $f(p^k)$ 容易计算。
方便起见,定义 $g(i)$ 表示将 $i$ 当作质数计算时的 $f(i)$,显然有 $f(p) = g(p)$,并定义 $p_i$ 表示第 $i$ 小的质数。特别地,$p_0 = 1$。
此时的 $g$ 为完全积性函数!即 $\forall i,j$,$g(i\times j) = g(i)\times g(j)$ 恒成立。
预处理 $sum_i = \sum\limits_{j=1}^i f(p_j) = \sum\limits_{j=1}^i g(p_j)$。由于一个合数的最小质因子 $\le \sqrt n$,所以只需要预处理到 $\le \sqrt n$ 的质数,记 $cntp$ 表示这些质数的数量。
计算过程
Step 1
记 $G_k(i)$ 表示 $i$ 以内所有质数以及最小质因子 $> p_k$ 的合数的 $g$ 之和。即埃筛第 $k$ 轮所剩下的数的 $g$ 之和。
同样是由于合数的最小质因子 $\le \sqrt n$,所以 $k$ 只需要筛到 $\le \sqrt n$ 的质数即可。
初始时的 $G_0(i) = \sum\limits_{j=2}^i g(j)$。考虑使用埃筛的过程进行转移,有:
- 对于 $i \lt p_k^2$ 的部分保持不变,即 $G_k(i) = G_{k-1}(i)$。
- 对于 $p_k^2 \le i$ 的部分,被删掉的数一定含有质因子 $p_k$,贡献为 $-g(p_k)G_{k-1}(\lfloor \frac{i}{p_k} \rfloor)$。
- 对于 $p_k^2 \le i$ 的部分,根据 $G$ 的定义,在操作 $2$ 中被删去的数会存在使得 $j \lt k$ 的 $g(p_jp_k)$ 被多删去,要将这部分的贡献加回来,即 $g(p_k) sum_{k-1}$。
于是得到以下的递推式:
$$ G_k(i) = G_{k-1}(i) - [p_k^2 \le i]g(p_k)\left(G_{k-1}(\lfloor \frac{i}{p_k} \rfloor) - sum_{k-1}\right) $$同时,不难发现 $G_k(i)$ 中 $i$ 的有用取值只有 $i = \lfloor \frac{n}{d} \rfloor$,共 $\mathcal O(\sqrt n)$ 种。
Step 2
记 $F_k(i)$表示 $i$ 以内所有最小质因子 $> p_k$ 的数的 $f$ 之和。
分为两部分讨论贡献:
- 质数:所有质数的贡献 $G_{cntp}(i)$ 减去 $p_1 \sim p_j$ 的贡献,为 $G_{cntp}(i) - sum_j$。
- 合数:枚举最小质因子极其次数,贡献为 $\sum\limits_{\substack{j > k \\ p_j^e \le i}} f(p_k^e) \left( F_j(\lfloor \frac{i}{p_k^e} \rfloor) + [e \neq 1] \right)$,其中 $e \neq 1$ 计算的是 $p_k^e$ 的贡献。
容易发现答案就是 $F_0(n) + f(1) = F_0(n) + 1$。
复杂度证明
对于 Step 1 的复杂度,考虑每个 $i = \lfloor \frac{n}{d} \rfloor$,只在枚举 $p_k^2 \le i$ 时进行转移,所以时间复杂度如下:
$$ \begin{aligned} T(n) =& \sum_{i=1}^{\sqrt n} O\left( \frac{\sqrt i}{ \log \sqrt i} \right) + O\left( \frac{\sqrt \frac{n}{i}}{ \log \sqrt \frac{n}{i}} \right) \\ =& O\left( \int_1^{\sqrt n} \frac{\sqrt \frac{n}{i}}{ \log \sqrt \frac{n}{i}} \right) \\ =& O\left( \frac{n^\frac{3}{4}}{\log n} \right) \end{aligned} $$Step 2 的复杂度为 $\mathcal O(n^{1-\epsilon})$,证明见集训队论文 2018-朱震霆-2.3。
最后修改于 2025-06-30
Git 版本: eedba93