Live2D

Note - Powerful Number

Powerful Number

  对于 nN+,若不存在素数 p 使得 pn  p2n,则称 n 为 Powerful Number。即,n 的每个素因子至少以二次的形式存在。不难发现,任何一个 Powerful Number n 都可以写成 a2b3 (a,bN+) 的形式(但不唯一)。接下来,我们研究其在正整数前缀序列中出现次数的规模,有

i=1n[i is a P.N.]i=1n(ni2)13=n13i=1ni23n131nx23dx=n13(3x13)|1n12=O(n12)

所以 n 以内的 Powerful Number 的数量是 O(n) 级别,因此引出了基于 Powerful Number 数量的神奇筛法。

Powerful Number 筛法

  给出任意的积性函数 f,求

i=1nf(i)

  若按照正常杜教筛的方法,我们很可能无法找到一个 g 使得 fg 的前缀和易于计算。我们转而引入一个在素数处“拟合” f 的积性函数 g,即有

pP, g(p)=f(p)

同时保证 g 的前缀和易于计算。接着构造出类似杜教筛的卷积形式,令

h=fg1

那么

i=1nf(i)=i=1nh(i)j=1nig(j)

  有何特别之处呢?考虑任意素数 p

f(p)=g(p)+h(p)=g(p)        h(p)=0

gf=gh 均为积性函数,所以 h 为积性函数,况且 h(p) 恒为 0,所以使得 h(a)0a 为 Powerful Number!我们只需要预处理出 O(n)g 的前缀和,再大力搜索不为 0h(a),就能算出上式的结果啦!

例题

「LOJ #6053」简单的函数

  Link.

  积性函数 f 满足 f(pc)=pc (pP,cN+),求 i=1nf(i)mod(109+7)

  n1010


  首先,考虑 f 的素数点值:

f(p)={3,p=2p1,otherwise

p1 联想到 φ(p)=p1,可惜 φ(2)=1。干脆一点,我们直接强行把 φ 的偶数点值乘上 3,令

g(n)={φ(n),2n3φ(n),otherwise

显然它也是积性函数。

  接着,求 g 的前缀和。其前缀和为 φ 的前缀和加上两倍偶数点的 φ 前缀和。记

S(n)=i=1nφ(2i)=i=1n[2i]φ(i)+2i=1n[2i]φ(i)=S(n2)+i=1nφ(i)

杜教筛处理 φ 的前缀,S 就能在可观(我不会算 qwq)的复杂度内预处理出来,继而也得到了 gO(n) 个前缀和。

  此外,我们还需要求 h(i),即求 h(pc) (c>1)。考虑 f(pc) 与它的关系:

f(pc)=i=0ch(pi)g(pci)    h(pc)=f(pc)i=0c1h(pi)g(pci)

顺手把 O(nlnlnn)n 以内素数的倒数和的规模是 O(lnlnn))个 h(pc) 也预处理出来,最后 O(n) 搜索 Powerful Number 就能求出答案啦!

  代码可见我的博客

「洛谷 P5325」Min_25 筛

  Link.

  对于积性函数 f(x),有 f(pk)=pk(pk1) (pP,kN+)。求 i=1nf(i)mod(109+7)

  n1010


  Min_25 筛是不可能的。

  Powerful Number 三步走咯!考虑素数点值:

f(p)=p2p

那么令 g=idφ(点乘号即数值相乘),就有 g(p)=p2p。积性函数的点乘亦为积性函数。

  求 g 的前缀和,杜教筛基础操作,卷上一个 id

[(idφ)id](n)=in(idφ)(i)ni=innφ(i)=n2

自然数平方和易求,丢到杜教筛的式子里,推导后得出

S(n)=n(n+1)(2n+1)6i=2niS(ni)

其中 S(n) 即为 i=1ng(i)

  求 h(pk),可以用 Bell 级数推导。令 Fp,Gp,Hp 分别为 f,g,h 在某一素数 p 的 Bell 级数,则

{Fp=OGF1,p(p1),p2(p21),=11p2z11pz+1Gp=OGF1,p(p1),p3(p1),=1pz1p2z

应用“两函数 Bell 级数的乘法卷积”为“原函数 Dirichlet 卷积之 Bell 级数”的性质,得到

Hp=FpGp=11p2z11pz+11pz1p2z=11p2z1pz+1p2z1pz=11pz1p2z(1pz)2+1p2z1pz

我们仅仅想求 h(pk),即 [zk]Hp,那么

[zk]Hp=[zk]11pz[zk]1p2z(1pz)2[zk]1p2z1pz=pk[(k+1)pkkpk+1]+(pkpk+1)=(k1)(pk+1pk)

  最终,O(n23) 就能求出答案啦。

  代码可见我的博客

总结

  • Powerful Number 指每个素因子至少是二次的正整数;
  • [1,n] 内的 Powerful Number 个数为 O(n)
  • Powerful Number 筛法的步骤为:
    1. 对于 f,找到素数点值与其相同的,方便求前缀和的函数 g
    2. 预处理/在线求 gO(n) 个前缀和;
    3. 预处理/在线求 (fg1)(pk),可以暴力计算或尝试 Bell 级数;
    4. 爆搜 Powerful Number 统计答案。
  • 此筛法是否优秀大部分取决于第三步,即能否快速计算 (fg1)(pk)
posted @   Rainybunny  阅读(129)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示