Powerful Number筛
用途
求积性函数 \(f\) 的前缀和 \(F(n)=\sum_n^{i=1} f(i)\).
复杂度 \(O(\sqrt{n})\) 或 \(O(\sqrt{n}\log n)\) 或 \(O(n^{\frac{2}{3}})\).
使用条件
存在一个函数 \(g\) 满足:
- \(g\) 是积性函数
- \(g\) 易求前缀和
- 对于质数 \(p\),\(g(p)=f(p)\)
Powerful Number
定义为每个质因子次数都不小于 \(2\) 的数.
将 PN 表示为 \(a^2b^3\) 的形式, 积分可以证明, \(n\) 以内的 PN 只有 \(O(\sqrt{n})\) 个.
可以通过线性筛筛出 \(\sqrt{n}\) 内的所有质数, 然后直接 dfs 质数指数搜出所有 PN, 复杂度是 \(O(\sqrt{n})\) 的.
原理
首先,构造出合适的 \(g\), 记 \(G(n)=\sum^n_{i=1} g(i)\).
然后考虑另一个函数 \(h\), 满足 \(f=g∗h\), 故 \(h\) 也为积性函数.
代入 \(f(p)=h(p)g(1)+g(p)h(1)=h(p)+g(p)\) 容易得到 \(h(p)=0\) , 由于 \(h\) 为积性函数, 故 \(h\) 仅在 PN 处不为 \(0\).
搜索所有 PN, 维护出 \(h(d)\) 即可计算, 因此需要求出 \(h(p^c)\) 的值, 共 \(O(\Pi(\sqrt{n})*\log{n}) = O(\sqrt{n})\) 个.
若能线性预处理 \(h(p^c)\) , 则总复杂度为 \(O(\sqrt{n})\).
若能快速求 \(f(p^c)\) 和 \(g(p^c)\), 则可以根据 \(h(p^c)=f(p^c)-\sum_{i=1}^{c} g(p^i)h(p^{c-i})\), \(O(\sqrt{n}\log{n})\) 预处理.
- 常见 \(\frac{g(p^c)}{g(p^{c-1})}\) 为常数 \(t\) 时, 易得:
- 则 \(h(p^c)=f(p^c)-t * f(p^{c-1})\).
若使用杜教筛求 \(G\), 则总复杂度和杜教筛相同.
因为若事先计算一次 \(G(n)\) , 则杜教筛过程中用到的 \(G(\lfloor \frac{n}{d} \rfloor)\) 都是访问过的.