几类积性函数的筛法
杜教筛
前置知识:积性函数的狄利克雷卷积:
求 \(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}\)。
推导过程如下:
由于 \(g\) 为积性函数,所以 \(g(1) = 1\)。
使用数论分块并递归求解 \(\sum\limits_{i=2}^{n} g(i)F(\lfloor \frac{n}{i} \rfloor)\),直接计算复杂度为 \(O(n^{\frac{3}{4}})\),若使用线性筛预处理出前 \(n^{\frac{2}{3}}\) 项并使用 unordered_map 进行记忆化可以做到 \(O(n^{\frac{2}{3}})\)。
复杂度证明
考虑 \(g\) 和 \(h\) 的前缀和可以 \(O(1)\) 计算的情况。设 \(T(n)\) 为计算 \(F(n)\) 的时间复杂度,有
将 \(T(n)\) 展开一层即可,因为有 \(\lfloor \frac{\lfloor \frac{n}{x} \rfloor}{y} \rfloor = \lfloor \frac{n}{xy} \rfloor\),所以再展开就会被记忆化。
假设使用线性筛预处理了前 \(k\) 个前缀和,且 \(k \ge \sqrt n\),则
数论分块套杜教筛
若在杜教筛外面套一次数论分块,时间复杂度仍为 \(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 最多有 \(O(\sqrt n)\) 个。
证明2:枚举 \(a\) 后,考虑满足条件的 \(b\) 的个数,所以个数约为
要求出 \(n\) 以内的 PN,只需要先线性筛出 \(\sqrt n\) 以内的质数,再 DFS 搜索出各质数的指数即可,复杂度还是 \(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\),有
下面考虑如何计算出 \(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)\),时间复杂度为 \(O(\frac{\sqrt n}{\log n} \log^2 n) = O(\sqrt n \log n)\),空间复杂度为 \(O(\sqrt n)\)。
对于计算过程中的时间复杂度,假设可以 \(O(1)\) 求出 \(G(\lfloor \frac{n}{d} \rfloor)\),则显然为 \(O(\sqrt n)\)。若使用杜教筛求出 \(G(\lfloor \frac{n}{d} \rfloor)\),则时间复杂度为 \(O(n^\frac{2}{3})\),证明如下(其实与数论分块套杜教筛的复杂度证明相同):
若事先计算一次 \(G(n)\),且使用线性筛优化以及
unordered_map等进行记忆化,则 PN 筛过程中用到的 \(G(\lfloor \frac{n}{d} \rfloor)\) 都已经被记忆化。
综上所述,若可以 \(O(1)\) 求出 \(G(n)\),则 PN 筛的时间复杂度为 \(O(\sqrt n \log n)\),否则使用杜教筛求出 \(G(n)\) 则时间复杂度为 \(O(n^\frac{2}{3})\)。空间复杂度均为 \(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)\) 中 \(i\) 的有用取值只有 \(i = \lfloor \frac{n}{d} \rfloor\),共 \(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\) 时进行转移,所以时间复杂度如下:
Step 2 的复杂度为 \(O(n^{1-\epsilon})\),证明见集训队论文2018-朱震霆-2.3。

浙公网安备 33010602011771号