浅谈 Powerful number 筛

\(\text{Powerful number}\) 筛。
一种具有优化时间(代码)复杂度和简化函数复杂度双重优点的筛法。
\(\text{Powerful number}\) 虽然像杜教筛一样只能筛单项式积性函数 , 但是它的单项式可以比普通的积性函数复杂。如 \(\text{Min_25}\) 的模板 : 简单的函数 , 可以用 \(\text{Powerful number}\) 跑过去。
以下默认 $ p \in \text{Prime}$。

考虑求 \(\sum\limits^n_{i=1} f(i)\) , 其中 \(f(a)f(b)=f(ab) , a \perp b\)
考虑构造 \(g(p)=f(p)\)。接着构造 \((g*h)(a)=f(a)\)
那么由于:

\[\begin{aligned} f(p) = & \sum\limits_{d|p} h(d)g(pd^{-1}) \\ = & h(1)g(p)+h(p)g(1) \\ = & g(p)+h(p) \end{aligned}\]

但是因为已经构造了 \(g(p)=f(p)\) , 所以 \(h(p)=0\)
但是由于 \(h(p^b) , b>1\) 是无法直接和 \(h(p)\) 扯上关系的 (毕竟 \(h(p^b) \not = h(p)^b\)) , 则有 :
\(a=\prod\limits^{z}_{i=1} \text p_i^{k_i}\) , 若 \(k_i \leq 1 , i \in [1,z]\) , 且 \(a\) 不等于 \(0\)\(1\) , 则有 \(h(a)=0\)
反之 , 由于 \(g\) 不用全部拟合 \(h\) , 所以若 \(k_i \not =1 , i \in [1,z]\) , \(h(a) \not = 0\)。而 \(n\) 内这些 \(a\) 的个数可以被积分算出来 , 数量级是 \(n^{\frac 1 2}\) 个的。这是 \(\text{Powerful number}\) 的关键。
为了方便 , 我们把质因子的次数都大于一的数叫做 \(\text{Powerful number}\) , 若 \(a\)\(\text{Powerful number}\) , 则表示为 \(a \in \mathbb{PN}\)

直接考虑 \(f\) 求和 , 则有 :

\[\begin{aligned} \sum\limits^{n}_{i=1} f(i) & = \sum\limits^{n}_{i=1} \sum\limits_{d|i} h(d)g(id^{-1}) \\ & = \sum\limits^{n}_{i=1} \sum\limits^{n}_{d=1} h(d)g(id^{-1}) [d|i] \\ & = \sum\limits^{n}_{d=1} h(d)\sum\limits^{\left\lfloor\frac{n}{d}\right\rfloor}_{i=1}g(id \times d^{-1}) [d|id] \\ & = \sum\limits^{n}_{d=1} h(d)\sum\limits^{\left\lfloor\frac{n}{d}\right\rfloor}_{i=1}g(i) \\ \end{aligned}\]

又因为 \(h\) 有值的地方只有 \(n^{\frac 1 2}\) 处 , 所以这个地方可以直接把 \(\text{Powerful number}\) 弄出来然后求 \(g\) 的和。
考虑 \(g\) 质数拟合以后是一个普通的积性函数或更加简单 , 那么求和部分就直接交给杜教筛或者更简单的 (求和公式??) 来求即可。

现在考虑 \(h(a) , a \in \mathbb{PN}\) 的值。
首先将问题转化一下 , 由于 \(a\) 只有那么点 , 且 \(h\) 仍是积性函数 , 所以可以完全爆搜 \(h(p^k) , k>1\) 来乘出 \(h(a)\)。直接考虑 \(h(p^k)\) 的求法 :

\[\begin{aligned} f(p^k) & = \sum\limits_{d|p^k} h(d)g(p^kd^{-1}) \\ f(p^k) & = \sum\limits^{k}_{d=0} h(p^d)g(p^{k-d}) \\ f(p^k) & = h(p^k)g(1)+\sum\limits^{k-1}_{d=0} h(p^d)g(p^{k-d}) \\ h(p^k) & = f(p^k)-\sum\limits^{k-1}_{d=0} h(p^d)g(p^{k-d}) \\ \end{aligned}\]

注意到如果 \(f(p^k)\)\(g(p^k)\) 可以快速求出的话 , 那么 \(h(p^k)\) 也就只和 \(h(p^{t}) , t<k\) 有关了。这样子可以直接求啦。
但是要考虑这一段的复杂度 , 因为要枚举的质数只有 \(n^{\frac 1 2}\) 个 , 每一个质数的次数不会超过 \(\log_{\text{minimum} p} n\) , 那么显然次数不超过 \(\log_2 n\) , 这一段的复杂度就是 \(n^{\frac 1 2} \log n\) (其实远远小于)。
再考虑组合成 \(\mathbb{PN}\) , 我们也可以直接枚举 \(n^{\frac 1 2}\) 内每一个质数的次数 。这样子的复杂度是不会爆炸的 , 因为如果合法我们可以继续搜 , 如果不合法因为单调性直接跳就行。这样子的复杂度不会超过 \(\mathbb{PN}\) 的个数即 \(n^{\frac 1 2}\)

然后奇迹的时刻就到了。
考虑 \(\sum\limits^{n}_{d=1} h(d)\sum\limits^{\left\lfloor\frac{n}{d}\right\rfloor}_{i=1}g(i)\) 这个式子 , 直接 \(n^{\frac 1 2}\) 就求出来了??
好吧 , 只要你 \(g\) 拟合的好就行了。

来几个例题。
\(f(p^c)=p \text{ xor } c\) 。考虑 \(f(p)=p \text{ xor } 1=p-1\) , 就可以构造 \(g(x)=\phi(x)\) 则有 \(g(p)=p-1\) , \(g\) 可以杜教筛求 , 整个复杂度就是 \(O(n^{\frac 2 3}+n^{\frac 1 2} \log n)\)
\(f(p^c)=p\) 。考虑构造 \(g(x)=x\) , 则有 \(g(p)=p=f(p)\) , 那么 \(g(x)\) 就可以求和公式求了。整个的复杂度就变成了 \(O(n^{\frac 1 2} \log n)\)

posted @ 2020-04-18 21:25  _ARFA  阅读(290)  评论(0编辑  收藏  举报