从 PN 筛到红场阅兵:一二维积性函数筛法总结
从 PN 筛到红场阅兵:一二维积性函数筛法总结
PN 筛
引入
Powerful Number 筛,简称 PN 筛,又称扩展杜教筛,是一个用于快速求取特定积性函数前缀和的算法。
PN 筛对积性函数提出以下要求:
- 存在积性函数 \(g\),满足:
- \(g\) 前缀和易求;
- \(\forall p \in \mathbb{P}\),有 \(g(p) = f(p)\)。
Powerful Number
定义
对于正整数 \(n\),记 \(n = \prod\limits p_i^{k_i}\)(\(p_i\) 为第 \(i\) 个质数),若满足 \(\forall i, k_i > 1\),则称 \(n\) 是 PN。
Lemma 1
所有 PN 均可以表示为 \(a^2b^3\) 的形式。
证明:等价于命题:\(\forall k > 1, \exists x, y \ge 0\) 满足 \(k = 2x + 3y\)。不难发下这等价于 \(k = 2(x + y) + y\),分为奇偶讨论即可得证。
Lemma 2
\(1 \sim n\) 范围内的 PN 个数是 \(\mathcal O(\sqrt n)\) 的。
提供两种证明方式:
- 证明 1:考虑将求和强化为积分:\(\displaystyle\int_1^{\sqrt n} (\dfrac{n}{x^2})^{1 \over 3} \approx \sqrt n\);
- 证明 2:考虑缩放,对于 \([2^k, 2^{k + 1})\) 的部分视为相同的,可以写出:\(\sum\limits_{k = 1}^{\log(\sqrt n)}(\dfrac{n}{4^k})^{1 \over 3} \times 2^k = n^{1 \over 3} \sum\limits_{k = 1}^{\log(\sqrt n)}2^{k \over 3} \approx \sqrt n\)。
过程
考虑找一个易求前缀和的积性函数 \(g\),满足 \(\forall p \in \mathbb P\),\(g(p) = f(p)\)。构造函数 \(h = f / g\)(除法为狄利克雷除法),可以发现 \(h\) 具有以下性质:
- \(h\) 为积性函数,\(h(1) = 1\);
- \(h(p) = 0\),证明考虑 \(f(p) = g(p)h(1) + g(1)h(p)\),又 \(g(p) = f(p)\)。
由积性函数的性质,我们可以推到出一个衍生结论:\(h\) 仅在 PN 出有值。
于是有:
考虑用深搜找出所有 PN,在点值处统计答案,\(h\) 在质数处的点值可以考虑用逐位确定的方法求出。
复杂度
时空复杂度均与 PN 同阶,\(\mathcal O(\sqrt n \log^k n)\),\(\log\) 因子视情况和实现而定。
Min_25 筛
引入
由 Min_25 最早发明的积性函数筛法,又称扩展埃氏筛。
Min_25 筛对积性函数提出以下要求:
- \(f(p)(p \in \mathbb{P})\) 是一个关于 \(p\) 项数合理的多项式;
- 易求 \(f(p^c)\) 点值。
约定 & 记号
约定无特殊说明时,\(p \in \mathbb P\)。
记 \(\newcommand\fp{F_{\mathbb P}} \fp(n) = \sum\limits_{p \le n}f(p)\);
记 \(\newcommand\fc{\operatorname{lpf}} \fc(n) = \min\limits_{p | n} p\),\(F_k(n) = \sum\limits_{i \le n \land \fc(i) > p_k} f(i)\),约定 \(p_0 = 1\)。
过程
观察 \(F_k\) 的定义不难发现所求即为 \(F_0(n) + 1\)。
计算 \(F_k\)
枚举每个数的最小质因子不难有递推式:
具体的即分为质数和合数两部分考虑贡献。
由于若 \(p_t^2 > n\),则 \(p_t > \dfrac{n}{p_t}\),即合数部分贡献为 \(0\),所以仅 \(p_t \le \sqrt n\) 的 \(t\) 有用。
发现除去 \(\fp(p_k)\) 的部分实际上与 \(k\) 无关,所以假设我们已经知道了 \(\fp(n)\) 并筛出了 \(1 \sim \sqrt n\) 内的质数,可以从大到小枚举转移点 \(t\),即可做到 \(\mathcal O(\sqrt n)\) 空间筛 \(F_k\)。
计算 \(\fp(n)\)
注意到 \(f(p)\) 是合理次多项式,所以我们考虑分开计算多项式每一项的贡献,令 \(g(p) = p^s\),不难发现这是完全积性函数,不难用插值计算 \(\sum\limits_{i \le n} g(i)\) 的值。于是我们的目标变成筛除 \(1 \sim n\) 中的合数贡献。
发现合数的最小因子时 \(\sqrt n\) 级别的,设计 \(G_k(n) = \sum\limits_{i \le n}[\fc(i) > k \lor i \in \mathbb P] g(i)\),即埃氏筛 \(k\) 轮后的贡献。注意到与埃氏筛的联系后不难有递推式:
具体的即考虑筛除最小因子为 \(p_k\) 的部分在将质数的贡献加回来,显然只有当 \(p_k \le \sqrt n\) 时才有转移贡献。
复杂度
考虑到仅有 \(\lfloor \dfrac{n}{x} \rfloor\) 共 \(\sqrt n\) 个点值需要考虑,所以空间复杂度 \(\mathcal O(\sqrt n)\)。
时间复杂度 \(\mathcal O(\dfrac{n^{\frac{3}{4}}}{\log n})\),证明不太会。
二维积性函数
引入
考虑定义二维数论函数 \(f(i, j)\) 时积性的,当且仅当:任意 \(ab \bot cd\),有 \(f(ac, bd) = f(a, b) \times f(c, d)\)。
形式化的表达:若 \(A = \prod p_i^{a_i}, B = \prod p_i^{b_i}\),则有 \(f(A, B) = \prod f(p^{a_i}, p^{b_i})\)。
同样可以定义二维狄利克雷卷积:\((f \times g)(n, m) = \sum\limits_{u | n, v | m} f(u, v)g(\dfrac{n}{u}, \dfrac{n}{v})\),通过逐位确定可以类似定义狄利克雷除法。
红场阅兵
积性函数 \(S\):满足 \(S(p)\) 为给定二次函数,求 \(\sum\limits_{i \le n} \sum\limits_{j \le n} S(ij)\)。
数据范围:\(n \le 10^9\),提交地址:https://uoj.ac/contest/88/problem/885。
定义二维积性函数 \(f(i, j) = S(ij)\),所求即为 \(f\) 的二维前缀和,记 \(F(n) = \sum\limits_{i \le n} S(i)\)。
算法一
类似 PN 筛的思想,考虑设计二维积性函数 \(g\) 满足 \(g(p^a, p^b) = S(p^a)S(p^b) = f(p^a, 1)f(1, p^b)\)。令 \(h = f / g\),于是不难发现对于任意 \(k\),\(h(1, p^k) = h(p^k, 1) = 0\)。
于是能将答案简化为:
考虑用 Min_25 筛出 \(F\) 的所需点值,那么这个算法的时间复杂度实际上是 \(\mathcal O(n)\) 的。
算法二
进一步的可以继续设计函数 \(g_3\),\(g_3(x, y)\) 有值当且仅当 \(x = y\),且值为 \(h(x, x)\)。那么同样的套路启发我们考虑 \(h^\prime = h / g_3\),可以发现此时 \(h^\prime(p^a, p^b)\) 有值就当且仅当 \(a, b > 0 \land a \ne b\)。
通过枚举 \(h^\prime\) 有值的所有位置 \((u, v)\),记 \(A = n / u, B = n / v\),我们将问题转化为计算:
假设我们筛出了 \(g_3\) 的前缀和,那么不难用整出分块优化这部分的计算,不难做到 \(\mathcal O(\sqrt A + \sqrt B)\) 单次询问。事实上,我们发现 \(A, B\) 是等价的,可以随意交换,于是不失一般性的假设 \(A > B\)。如果我们考虑将 \(A\) 相同的询问统一处理,复杂度就是 \(\mathcal O(\sqrt A + \sum\limits_i \sqrt B)\),可以减少一半的常数。
注意到由于 \(g_3(p, p) = h(p, p) = f(p, p) - g(p, p) = S(p^2) -S^2(p)\) 是一个四次多项式,而 \(g_3(p^k)(k > 1)\) 的点值均可筛出,所以 \(g_3\) 是符合 Min_25 筛的使用条件的!于是筛法解决即可。
复杂度
实际上上述算法除了 \(g_3\) 和 \(S\) 的前缀和的部分是 \(\mathcal O(n^{\frac{2}{3}} \log n)\) 的,下面给出证明:
考虑记 \(v(i, j)\) 表示 \(h^\prime(i, j)\) 是否有值,不难发现 \(v(i, j)\) 是积性函数,且 \(v(p^a, p^b) = [a, b > 0 \land a \ne b]\)。接下来我们要估计 \(\sum\limits_{i, j \le n} v(i, j)\) 的上界。
考虑设计积性函数 \(v_1, v_2\) 满足 \(v_1(p^a, p^b) = [a = 1, b = 2 \lor a = 2, b = 1], v_2(p^a, p^b) = v(p^a, p^b) - v_1(p^a, p^b)\)。不难发现 \((v_1 \times v_2)(i, j) \ge v(i, j)\)。
考虑分析 \(\sum\limits_{i \le n, j \le m} v_1(i, j)\):如果按 \(a = 2\) 还是 \(b = 2\) 分类,则能将 \((i, j)\) 写成 \((a^2b, b^2a)\) 的形式,于是有原式等于 \(\sum\limits_{a^2 \le n, a \le m} \min(n / a^2, \sqrt{m / a})\);设 \(B = \sqrt[3]{\dfrac{n^2}{m}}\),原式等于 \(\sum\limits_{a \le B} \sqrt{\dfrac{m}{a}} + \sum\limits_{B < a \le \sqrt n} \dfrac{n}{a^2} \approx \sqrt{mB} + \dfrac{n}{B} = (nm)^{\frac{1}{3}}\)。
考虑 \(v_1 \times v_2\),其前缀和不超过 \(\sum\limits_{x, y, v_2(x, y) > 0, xy \le nm} (\dfrac{nm}{xy})^{1 / 3}\)。这里要用到 zky 给出了一个结论:
对满足存在序列 \(a\)(序列非负且为常数次多项式级别),使得 \(f(p^k) = a_k(k \ge 1)\),的一维积性函数前缀和级别不会超过 \(\mathcal O(n^{1 / p} \log^{p - 1} n)\) 其中 \(p\) 为 \(a\) 第一个有值的位置。
基于这个结论,我们可以认为 \(\sum\limits_{xy \le L} v_2(x, y)\) 是 \(\mathcal O(L^{1/ 4} \log L)\)。
我们考虑应用上述 PN 筛中提到的二进制分组的分析方法,具体的将 \(\lfloor \log(xy) \rfloor\) 的 \((x, y)\) 分到一组,记于是上式可以估计成:
于是 \(v_(i, j)\) 的前缀和也就是 \(\mathcal O((nm)^{\frac{1}{3}})\) 的了!
考虑分析第二部分的复杂度,即:
不妨认为 \(n, m\) 同阶,则 \(\min(x, y, \sqrt{n / x} + \sqrt{n / y}) \le \min(x, \sqrt{n / y}) + \min(y, \sqrt{n / x})\),不难发现两部分是对称的,只取一部分分析。大约是:
这个复杂度就足够优秀了!