Loading

[笔记] Powerful Number 筛

定义

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

要求

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

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

Powerful Number

定义:每个质因子次数都 \(≥2\) 的数。

性质

  • 所有的 PN 都可以表示成 \(a^2b^3\)

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

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

原理

首先,构造出合适的 \(g\),记 \(G(n)=\sum_{i=1}^ng(i)\)

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

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

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

现在,根据 \(f=g*h\) 有:

\[\begin{aligned} F(n)&=\sum_{i=1}^nf(i)\\ &=\sum_{i=1}^n\sum_{d\mid i}h(i)g(\frac{i}{d})\\ &=\sum_{d=1}^nh(d)\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}g(i)\\ &=\sum_{d\text{ is PN}}h(d)G(\lfloor\frac{n}{d}\rfloor) \end{aligned} \]

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

根据 \(f=g*h\),可得 \(h(p^c)=f(p^c)-\sum_{i=1}^cg(p^i)h(p^{c-i})\)

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

复杂度分析

可以分为计算 \(h(p^c)\) 和搜索两部分进行分析。

  • 根据 \(O(\sqrt n)\) 内的素数个数为 \(O(\dfrac{\sqrt n}{\log n})\),因此时间复杂度为 \(O(\sqrt n\log n)\)

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

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

    特别地,若杜教筛计算 \(G(\lfloor\frac{n}{d}\rfloor)\),则时间复杂度为杜教筛的时间复杂度,即 \(O(n^{\frac{2}{3}})\)

    对于空间复杂度,其瓶颈在于存储 \(h(p^c)\),若使用二维数组 \(a\) 记录,\(a_{i,j}\) 表示 \(h(p_{i}^j)\) 的值,则空间复杂度为 \(O(\sqrt 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 @ 2022-03-18 17:21  IrisT  阅读(127)  评论(0编辑  收藏  举报