[笔记] Powerful Number 筛

定义#

Powerful Number(以下简称 PN)筛类似于杜教筛,可以拿来求一些积性函数的前缀和。

要求

假设现在要求积性函数 f 的前缀和 F(n)=i=1nf(i),需要存在一个函数 g 满足:

  • g 是积性函数。
  • g 易求前缀和。
  • 对于质数 pg(p)=f(p)

Powerful Number#

定义:每个质因子次数都 2 的数。

性质

  • 所有的 PN 都可以表示成 a2b3

  • n 以内的 PN 至多是 O(n) 个,可以积分证明。

枚举:线性筛出 n 以内的质数,dfs 搜索每个质数的指数,时间复杂度 O(n)

原理#

首先,构造出合适的 g,记 G(n)=i=1ng(i)

然后考虑另一个函数 h,满足 f=gh,故 h 也为积性函数,且 h 仅在 PN 处不为 0

首先考虑质数 pf(p)=g(1)h(p)+g(p)h(1)=h(p)+g(p),故 h(p)=0.

h 是积性函数,故对于非 PN 的数 n,都有 h(n)=0

现在,根据 f=gh 有:

F(n)=i=1nf(i)=i=1ndih(i)g(id)=d=1nh(d)i=1ndg(i)=d is PNh(d)G(nd)

那么现在要考虑的问题就只是 PN 处 h 的取值如何计算,也就是计算 h(pc)

根据 f=gh,可得 h(pc)=f(pc)i=1cg(pi)h(pci)

也可以考虑直接推 h 的式子。

复杂度分析#

可以分为计算 h(pc) 和搜索两部分进行分析。

  • 根据 O(n) 内的素数个数为 O(nlogn),因此时间复杂度为 O(nlogn)

    此处计算的上界较为宽松,可以根据题目优化。

  • 对于搜索部分,由于 n 以内的 PN 至多有 O(n) 个,所以至多搜索 O(n) 次。对于每一个 PN,假设计算 G(nd) 的时间复杂度为 O(1) ,则第二部分的复杂度为 O(n)

    特别地,若杜教筛计算 G(nd),则时间复杂度为杜教筛的时间复杂度,即 O(n23)

    对于空间复杂度,其瓶颈在于存储 h(pc),若使用二维数组 a 记录,ai,j 表示 h(pij) 的值,则空间复杂度为 O(n)

void Enum(int x, LL d, int Hd){
	if(x > pcnt || (__int128) d * pri[x] * pri[x] > K){
		MOD(Ans += G(K / d) % mod * Hd % mod - mod);
		return;
	}
	Enum(x + 1, d, Hd);
	int cnt = 2; LL s = (LL) pri[x] * pri[x];
	while((__int128) d * s <= K){
		Enum(x + 1, d * s, (LL) Hd * H[x][cnt] % mod);
		if((__int128) s * pri[x] > K) break;
		s *= pri[x], ++cnt; 
	}	
}
posted @   IrisT  阅读(148)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示
主题色彩