Powerful Number 筛(PN 筛)可以解决一些求积性函数前缀和的问题。要求能构造出一个积性函数 g,满足:
- g 容易求前缀和;
- 对于质数 p,f(p)=g(p)。
称一个数 x 是 Powerful Number(PN)当且仅当 x 的质因数分解中,所有质因数的指数都 ≥2。1 是 PN。
有结论 ≤n 的 PN 有 O(√n) 个。并且若线性筛出 ≤√n 的所有质数,枚举每个质数的指数,就可以在 O(√n) 的时间复杂度内搜索出所有 PN。
假设我们已经构造出一个满足条件的 g。假设有一个积性函数 h,满足 f=g∗h。那么有 f(p)=g(1)h(p)+g(p)h(1)=g(p)+h(p),又因为 f(p)=g(p),所以 h(p)=0。所以 h(x) 有值当且仅当 x 是 PN。
推一下式子:
n∑i=1f(i)=∑ij≤ng(i)h(j)=n∑i=1h(i)⌊ni⌋∑j=1g(j)
因此我们只用枚举所有 ≤n 的 PN,然后快速计算 ⌊ni⌋∑j=1g(j) 即可。
问题来到如何计算 h(i)。因为 h 是积性函数,所以只用考虑如何计算 h(pk)。根据 f=g∗h 有:
f(pk)=k∑i=0g(pi)h(pk−i)
因此:
h(pk)=f(pk)−k−1∑i=0g(pk−i)h(pi)
进而可以暴力在 O(√n) 的时间复杂度内计算。
若 g 的前缀和能 O(1) 计算,那么 PN 筛的时间复杂度为 O(√n)。
例题
考虑构造 g=(id⋅φ),那么 g 的前缀和可以使用杜教筛计算(id2=(id⋅φ)∗id)。
时间复杂度 O(n23),瓶颈在杜教筛。
考虑构造 g=I∗id。那么 n∑i=1g(i)=n∑i=1i⌊ni⌋。若使用整除分块计算,设 P 为 PN 集合,时间复杂度 O(∑x∈Pnx)=O(√nlogn)。
考虑构造:
g(x)={3φ(x)2∣xφ(x)2∤x
那么 n∑i=1g(i)=n∑i=1φ(i)+2⌊n2⌋∑i=1φ(2i),可以杜教筛解决。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
2022-10-06 CodeForces 1654E Arithmetic Operations