几类积性函数的筛法

杜教筛

前置知识:积性函数的狄利克雷卷积:

\[\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)\),直接计算复杂度为 \(O(n^{\frac{3}{4}})\),若使用线性筛预处理出前 \(n^{\frac{2}{3}}\) 项并使用 unordered_map 进行记忆化可以做到 \(O(n^{\frac{2}{3}})\)

复杂度证明

考虑 \(g\)\(h\) 的前缀和可以 \(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 \]

数论分块套杜教筛

若在杜教筛外面套一次数论分块,时间复杂度仍为 \(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\) 的个数,所以个数约为

\[\int_{1}^{\sqrt n} \sqrt[3]{\frac{n}{x^2}} \mathrm{d}x = O(\sqrt n) \]

要求出 \(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\),有

\[\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)\),时间复杂度为 \(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)\)。考虑使用埃筛的过程进行转移,有:

  1. 对于 \(i \lt p_k^2\) 的部分保持不变,即 \(G_k(i) = G_{k-1}(i)\)
  2. 对于 \(p_k^2 \le i\) 的部分,被删掉的数一定含有质因子 \(p_k\),贡献为 \(-g(p_k)G_{k-1}(\lfloor \frac{i}{p_k} \rfloor)\)
  3. 对于 \(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\),共 \(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 的复杂度为 \(O(n^{1-\epsilon})\),证明见集训队论文2018-朱震霆-2.3

posted @ 2022-08-07 19:39  yaoxi-std  阅读(72)  评论(0)    收藏  举报