powerful number筛

心血来潮跑来实现以下这个东西

我们应该知道杜教筛的理论是 \(f * g=h\),那么问题在于如何找 \(g\)。

之前的blog应该提到过可以令 \(g(p)=-f(p)\),这样一来 \(h\) 就只会在PN处有值。于是可以大力爆搜 \(h\),而 \(g\) 的块筛又很好处理。

但是这样复杂度会有一个下限为 \(O(n^{\frac 2 3})\),有没有办法去除呢?

办法是有的,反过来,设 \(h * g=f\)。

此时我们构造 \(g(p)=f(p)\) 即可得到和上面相同的结论,但此时只需处理 \(g\) 的块筛即可,复杂度下降至 \(O(\frac{n^{\frac 3 4}}{\log n})\) 或者更低。

问题来了,当 \(k>2\) 时,\(g(p^k)\) 应该是多少?

实际上是多少否无所谓,因为有 \(\sum_{i=0}^k h(p^i)g(p^{k-i})=f(p^k)\),一般情况令 \(g(p^k)=0\)。

但是我在实现的时候 推 错 了 \(g\) 的 块 筛 柿 子,懒得重新推。又发现我的柿子实际上是令 \(g(p^k)=f(p)^k\),如果直接暴力做卷积那么复杂度会变成 \(O(\sqrt n\log n)\),于是来优化一下:

\[\sum_{i=0}^kh(p^i)f(p)^{k-i}=f(p^k) \]

\[f(p)^k\sum_{i=0}^kh(p^i)f(p)^{-i}=f(p^k) \]

于是处理出 \(\frac{f(p^k)}{f(p)^k}\),然后来个差分求逆元就好,复杂度变回了 \(O(\sqrt n)\),不过需要存在逆元才行。

但是?

\[h(p^k)f(p)^{-k}=\frac{f(p^k)}{f(p)^k}-\frac{f(p^{k-1})}{f(p)^{k-1}} \]

\[h(p^k)=f(p^k)-f(p^{k-1})f(p) \]

不需要逆元也可以。

代码暂时咕了(

上一篇:Functional Programming in Java


下一篇:Ubuntu查看开放的端口信息