powerful number

基础

定义:所有质因子次幂至少为 \(2\) 的数,以下均简写为 PN。

性质 1:所有 PN 都可以表示成 \(a ^ 2b ^ 3\) 的形式且构成单射。

考虑构造一种方式使得一个 PN \(n\) 唯一对应一组 \((a, b)\)。
\(\forall p \in \mathbb{P}, p \mid n, \alpha = \max\limits_{p ^ {\beta} \mid n} \beta\) 若 \(2 \mid \alpha\) 则直接分配进 \(a\) 否则根据定义 \(\alpha \ge 3\) 先分一个 \(p ^ 3\) 进 \(b\) 其余全部分进 \(a\)。

性质 2:大小不超过 \(n\) 的 PN 数量为 \(\mathcal{O}(\sqrt{n})\)。

\(\sum\limits_{a = 1} ^ {\sqrt{n}} \lfloor\left(\frac{n}{a ^ 2}\right) ^ \frac{1}{3}\rfloor \le n ^ {\frac{1}{3}}\sum\limits_{a = 1} ^ {\sqrt{n}} a ^ {-\frac{2}{3}} \le n ^ {\frac{1}{3}}\int_1 ^ {\sqrt{n}} a ^ {-\frac{2}{3}}\mathrm{da} = n ^ {\frac{1}{3}} \cdot n ^ {\frac{1}{6}} = \sqrt{n}\).

寻找 \(\le n\) 的所有 PN 可以直接搜索,注意每次搜索都要保证加上一个质因子,这样复杂度才是 \(\mathcal{O}(\sqrt{n})\) 的。


流程

一般情况下,PN 筛法的要求如下:

  • 存在一个 \(g\) 满足:

    • \(g\) 是 积性函数
    • \(g(p) = f(p)(p \in \mathbb{P})\)。
    • \(g\) 易求前缀和,或易求 \(\lfloor \frac{n}{i} \rfloor(1 \le i \le n)\) 处的前缀和(一般都是用杜教筛,不然还不如直接其他筛法)

流程一般如下:

首先构造一个函数 \(h = f / g\),可知 \(h\) 也是一个积性函数。

目的是有 \(f = g * h\),且对于素数 \(p\) 有 \(f(p) = g(1)h(p) + g(p)h(1) = h(p) + g(p) \Rightarrow h(p) = 0\).

又 \(h\) 为积性函数,因此 \(h\) 只在 \(1\) 和 PN 处非零。

此时有:

\[\begin{aligned} F(n) &= \sum\limits_{i = 1} ^ n f(i)\\ &= \sum\limits_{i = 1} ^ n \sum\limits_{d \mid i} h(d)g(\frac{i}{d})\\ &= \sum\limits_{i \in \mathrm{PN}} h(i)S(\lfloor\frac{n}{i}\rfloor) \end{aligned} \]

其中 \(S\) 为 \(g\) 的前缀和,同时 \(h\) 也需要求出单点点值。

如果 \(h\) 能直接求出表达式自然最好,此时一般可以借助 \(\rm DGF\) 来直观得到表达式。

直接卷求 \(h\) 是不现实的,但 \(h\) 为积性函数,因此可以求出 \(h(p ^ c)\) 处的点值然后在搜索的时候合并。

如果能直接得到 \(h(p ^ c)\) 的表达式自然不在话下,如果不能,有一个通法。

我们有 \(h(1) = 1, h(p) = 0(p \in \mathbb{P})\),那么可以考虑递推求 \(h(p ^ c)\).

\[f(p ^ c) = \sum\limits_i ^ c g(p ^ i)h(p ^ {c - i}) = \sum\limits_{i = 1} ^ c g(p ^ i)h(p ^ {c - i}) + h(p ^ c) \]

\[h(p ^ c) = f(p ^ c) - \sum\limits_{i = 1} ^ c g(p ^ i)h(p ^ {c - i}) \]

分析一下复杂度,\(\forall p \in \mathbb{P}, p \le \sqrt{n}\) 他会贡献 \(\log_p ^ 2 n\) 的贡献。

对于 \(p \le n ^ {\frac{1}{4}}\) 贡献 \(\le \pi(n ^ {\frac{1}{4}}) \log ^ 2 n \le n ^ {\frac{1}{4}} \log n\).

对于 \(p > n ^ {\frac{1}{4}}\) 的部分,单个素数贡献可以视作常数,因此这部分复杂度 \(\mathcal{O}(\pi(\sqrt{n})) = \mathcal{O}(\frac{n ^ {\frac{1}{2}}}{\log n})\).

因此可知对 \(p ^ c\) 处递推 \(h\) 复杂度不为瓶颈,因此瓶颈就在算 \(S(n)\).


应用

PE639

简化题意:积性函数 \(f_k\) 满足 \(f_k(p ^ c) = p ^ k(p \in \mathbb{P}, c \ge 1), \forall k \in [1, 50]\) 求 \(F_k(10 ^ {12}), F_k(n) = \sum\limits_{i = 1} ^ n f_k(i)\).

答案对 \(10 ^ 9 + 7\) 取模。

\(f_k(p) = p ^ k\) 于是直接构造 \(g_k(n) = n ^ k\),\(g\) 的前缀和用拉格朗日插值,复杂度 \(\mathcal{O}(kn ^ {\frac{1}{2}})\).

【模板】Min_25筛

简化题意:积性函数 \(f(p ^ c) = p ^ c(p ^ c - 1)(p \in \mathbb{P})\) 求其在点 \(n\) 处的前缀和,答案对 \(10 ^ 9 + 7\) 取模。

\(f(p) = p(p - 1) = id(p)\varphi(p)\) 于是令 \(g = id \times \varphi\)。

有 \(\overline{g}(x) = \overline{id \times \varphi}(x) = \zeta(x - 2)\zeta ^ {-1}(x - 1) = \frac{\overline{id_2}(x)}{\overline{id_1}(x)}\),可知 \(g\) 为积性函数。

同时,借助 \(\rm DGF\) 也容易观察得到杜教筛可筛 \(g\),因此直接做即可,复杂度 \(\mathcal{O}(n ^ {\frac{2}{3}})\).

上一篇:vue实现文件预览


下一篇:pyqt制作深度学习训练软件