Powerful Number
对于 n ∈ N + n ∈ N + ,若不存在素数 p p 使得 p ∣ n ∧ p 2 ∤ n p ∣ n ∧ p 2 ∤ n ,则称 n n 为 Powerful Number。即,n n 的每个素因子至少以二次的形式存在。不难发现,任何一个 Powerful Number n n 都可以写成 a 2 b 3 ( a , b ∈ N + ) a 2 b 3 ( a , b ∈ N + ) 的形式(但不唯一)。接下来,我们研究其在正整数前缀序列中出现次数的规模,有
n ∑ i = 1 [ i is a P.N. ] ≤ n ∑ i = 1 ( n i 2 ) 1 3 = n 1 3 n ∑ i = 1 i − 2 3 ≤ n 1 3 ∫ n 1 x − 2 3 d x = n 1 3 ( 3 x 1 3 ) ∣ ∣ n 1 2 1 = O ( n 1 2 ) ∑ i = 1 n [ i is a P.N. ] ≤ ∑ i = 1 n ( n i 2 ) 1 3 = n 1 3 ∑ i = 1 n i − 2 3 ≤ n 1 3 ∫ 1 n x − 2 3 d x = n 1 3 ( 3 x 1 3 ) | 1 n 1 2 = O ( n 1 2 )
所以 n n 以内的 Powerful Number 的数量是 O ( √ n ) O ( n ) 级别,因此引出了基于 Powerful Number 数量的神奇筛法。
Powerful Number 筛法
给出任意的积性函数 f f ,求
n ∑ i = 1 f ( i ) ∑ i = 1 n f ( i )
若按照正常杜教筛的方法,我们很可能无法找到一个 g g 使得 f ⋆ g f ⋆ g 的前缀和易于计算。我们转而引入一个在素数处“拟合” f f 的积性函数 g g ,即有
∀ p ∈ P , g ( p ) = f ( p ) ∀ p ∈ P , g ( p ) = f ( p )
同时保证 g g 的前缀和易于计算。接着构造出类似杜教筛的卷积形式,令
h = f ⋆ g − 1 h = f ⋆ g − 1
那么
n ∑ i = 1 f ( i ) = n ∑ i = 1 h ( i ) ⌊ n i ⌋ ∑ j = 1 g ( j ) ∑ i = 1 n f ( i ) = ∑ i = 1 n h ( i ) ∑ j = 1 ⌊ n i ⌋ g ( j )
有何特别之处呢?考虑任意素数 p p :
f ( p ) = g ( p ) + h ( p ) = g ( p ) ⇒ h ( p ) = 0 f ( p ) = g ( p ) + h ( p ) = g ( p ) ⇒ h ( p ) = 0
而 g g ,f = g ⋆ h f = g ⋆ h 均为积性函数,所以 h h 为积性函数,况且 h ( p ) h ( p ) 恒为 0 0 ,所以使得 h ( a ) ≠ 0 h ( a ) ≠ 0 的 a a 为 Powerful Number!我们只需要预处理出 O ( √ n ) O ( n ) 个 g g 的前缀和,再大力搜索不为 0 0 的 h ( a ) h ( a ) ,就能算出上式的结果啦!
例题
「LOJ #6053」简单的函数
Link .
积性函数 f f 满足 f ( p c ) = p ⊕ c ( p ∈ P , c ∈ N + ) f ( p c ) = p ⊕ c ( p ∈ P , c ∈ N + ) ,求 ∑ n i = 1 f ( i ) mod ( 10 9 + 7 ) ∑ i = 1 n f ( i ) mod ( 10 9 + 7 ) 。
n ≤ 10 10 n ≤ 10 10 。
首先,考虑 f f 的素数点值:
f ( p ) = { 3 , p = 2 p − 1 , otherwise f ( p ) = { 3 , p = 2 p − 1 , otherwise
由 p − 1 p − 1 联想到 φ ( p ) = p − 1 φ ( p ) = p − 1 ,可惜 φ ( 2 ) = 1 φ ( 2 ) = 1 。干脆一点,我们直接强行把 φ φ 的偶数点值乘上 3 3 ,令
g ( n ) = { φ ( n ) , 2 ∤ n 3 φ ( n ) , otherwise g ( n ) = { φ ( n ) , 2 ∤ n 3 φ ( n ) , otherwise
显然它也是积性函数。
接着,求 g g 的前缀和。其前缀和为 φ φ 的前缀和加上两倍偶数点的 φ φ 前缀和。记
S ( n ) = n ∑ i = 1 φ ( 2 i ) = n ∑ i = 1 [ 2 ∤ i ] φ ( i ) + 2 n ∑ i = 1 [ 2 ∣ i ] φ ( i ) = S ( n 2 ) + n ∑ i = 1 φ ( i ) S ( n ) = ∑ i = 1 n φ ( 2 i ) = ∑ i = 1 n [ 2 ∤ i ] φ ( i ) + 2 ∑ i = 1 n [ 2 ∣ i ] φ ( i ) = S ( n 2 ) + ∑ i = 1 n φ ( i )
杜教筛处理 φ φ 的前缀,S S 就能在可观(我不会算 qwq)的复杂度内预处理出来,继而也得到了 g g 的 O ( √ n ) O ( n ) 个前缀和。
此外,我们还需要求 h ( i ) h ( i ) ,即求 h ( p c ) ( c > 1 ) h ( p c ) ( c > 1 ) 。考虑 f ( p c ) f ( p c ) 与它的关系:
f ( p c ) = c ∑ i = 0 h ( p i ) g ( p c − i ) ⇒ h ( p c ) = f ( p c ) − c − 1 ∑ i = 0 h ( p i ) g ( p c − i ) f ( p c ) = ∑ i = 0 c h ( p i ) g ( p c − i ) ⇒ h ( p c ) = f ( p c ) − ∑ i = 0 c − 1 h ( p i ) g ( p c − i )
顺手把 O ( √ n ln ln √ n ) O ( n ln ln n ) (n n 以内素数的倒数和的规模是 O ( ln ln n ) O ( ln ln n ) )个 h ( p c ) h ( p c ) 也预处理出来,最后 O ( √ n ) O ( n ) 搜索 Powerful Number 就能求出答案啦!
代码可见我的博客 。
「洛谷 P5325」Min_25 筛
Link .
对于积性函数 f ( x ) f ( x ) ,有 f ( p k ) = p k ( p k − 1 ) ( p ∈ P , k ∈ N + ) f ( p k ) = p k ( p k − 1 ) ( p ∈ P , k ∈ N + ) 。求 ∑ n i = 1 f ( i ) mod ( 10 9 + 7 ) ∑ i = 1 n f ( i ) mod ( 10 9 + 7 ) 。
n ≤ 10 10 n ≤ 10 10 。
Min_25 筛是不可能的。
Powerful Number 三步走咯!考虑素数点值:
f ( p ) = p 2 − p f ( p ) = p 2 − p
那么令 g = id ⋅ φ g = id ⋅ φ (点乘号即数值相乘),就有 g ( p ) = p 2 − p g ( p ) = p 2 − p 。积性函数的点乘亦为积性函数。
求 g g 的前缀和,杜教筛基础操作,卷上一个 id id :
[ ( id ⋅ φ ) ⋆ id ] ( n ) = ∑ i ∣ n ( id ⋅ φ ) ( i ) ⋅ n i = ∑ i ∣ n n φ ( i ) = n 2 [ ( id ⋅ φ ) ⋆ id ] ( n ) = ∑ i ∣ n ( id ⋅ φ ) ( i ) ⋅ n i = ∑ i ∣ n n φ ( i ) = n 2
自然数平方和易求,丢到杜教筛的式子里,推导后得出
S ( n ) = n ( n + 1 ) ( 2 n + 1 ) 6 − n ∑ i = 2 i S ( ⌊ n i ⌋ ) S ( n ) = n ( n + 1 ) ( 2 n + 1 ) 6 − ∑ i = 2 n i S ( ⌊ n i ⌋ )
其中 S ( n ) S ( n ) 即为 ∑ n i = 1 g ( i ) ∑ i = 1 n g ( i ) 。
求 h ( p k ) h ( p k ) ,可以用 Bell 级数推导。令 F p , G p , H p F p , G p , H p 分别为 f , g , h f , g , h 在某一素数 p p 的 Bell 级数,则
⎧ ⎨ ⎩ F p = OGF ⟨ 1 , p ( p − 1 ) , p 2 ( p 2 − 1 ) , ⋯ ⟩ = 1 1 − p 2 z − 1 1 − p z + 1 G p = OGF ⟨ 1 , p ( p − 1 ) , p 3 ( p − 1 ) , ⋯ ⟩ = 1 − p z 1 − p 2 z { F p = OGF ⟨ 1 , p ( p − 1 ) , p 2 ( p 2 − 1 ) , ⋯ ⟩ = 1 1 − p 2 z − 1 1 − p z + 1 G p = OGF ⟨ 1 , p ( p − 1 ) , p 3 ( p − 1 ) , ⋯ ⟩ = 1 − p z 1 − p 2 z
应用“两函数 Bell 级数的乘法卷积”为“原函数 Dirichlet 卷积之 Bell 级数”的性质,得到
H p = F p G p = 1 1 − p 2 z − 1 1 − p z + 1 1 − p z 1 − p 2 z = 1 − 1 − p 2 z 1 − p z + 1 − p 2 z 1 − p z = 1 1 − p z − 1 − p 2 z ( 1 − p z ) 2 + 1 − p 2 z 1 − p z H p = F p G p = 1 1 − p 2 z − 1 1 − p z + 1 1 − p z 1 − p 2 z = 1 − 1 − p 2 z 1 − p z + 1 − p 2 z 1 − p z = 1 1 − p z − 1 − p 2 z ( 1 − p z ) 2 + 1 − p 2 z 1 − p z
我们仅仅想求 h ( p k ) h ( p k ) ,即 [ z k ] H p [ z k ] H p ,那么
[ z k ] H p = [ z k ] 1 1 − p z − [ z k ] 1 − p 2 z ( 1 − p z ) 2 − [ z k ] 1 − p 2 z 1 − p z = p k − [ ( k + 1 ) p k − k p k + 1 ] + ( p k − p k + 1 ) = ( k − 1 ) ( p k + 1 − p k ) [ z k ] H p = [ z k ] 1 1 − p z − [ z k ] 1 − p 2 z ( 1 − p z ) 2 − [ z k ] 1 − p 2 z 1 − p z = p k − [ ( k + 1 ) p k − k p k + 1 ] + ( p k − p k + 1 ) = ( k − 1 ) ( p k + 1 − p k )
最终,O ( n 2 3 ) O ( n 2 3 ) 就能求出答案啦。
代码可见我的博客 。
总结
Powerful Number 指每个素因子至少是二次的正整数;
[ 1 , n ] [ 1 , n ] 内的 Powerful Number 个数为 O ( √ n ) O ( n ) ;
Powerful Number 筛法的步骤为:
对于 f f ,找到素数点值与其相同的,方便求前缀和的函数 g g ;
预处理/在线求 g g 的 O ( √ n ) O ( n ) 个前缀和;
预处理/在线求 ( f ⋆ g − 1 ) ( p k ) ( f ⋆ g − 1 ) ( p k ) ,可以暴力计算或尝试 Bell 级数;
爆搜 Powerful Number 统计答案。
此筛法是否优秀大部分取决于第三步,即能否快速计算 ( f ⋆ g − 1 ) ( p k ) ( f ⋆ g − 1 ) ( p k ) 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现