[笔记] 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\) 有:
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;
}
}
[笔记] Powerful Number 筛的更多相关文章
- Powerful Number 筛学习笔记
Powerful Number 筛学习笔记 用途 \(Powerful\ number\) 筛可以用来求出一类积性函数的前缀和,最快可以达到根号复杂度. 实现 \(Powerful\ number\) ...
- powerful number筛
心血来潮跑来实现以下这个东西 我们应该知道杜教筛的理论是 \(f * g=h\),那么问题在于如何找 \(g\). 之前的blog应该提到过可以令 \(g(p)=-f(p)\),这样一来 \(h\) ...
- Powerful Number 学习笔记
定义 对于一个正整数 \(n\) ,若完全分解之后不存在指数 \(=1\) ,则称 \(n\) 为 \(\text{Powerful Number}\) . 可以发现的是,在 \([1,n]\) 中, ...
- 利用powerful number求积性函数前缀和
好久没更博客了,先水一篇再说.其实这个做法应该算是杜教筛的一个拓展. powerful number的定义是每个质因子次数都 $\geq 2$ 的数.首先,$\leq n$ 的powerful num ...
- Note - Powerful Number
Powerful Number 对于 \(n\in\mathbb N_+\),若不存在素数 \(p\) 使得 \(p\mid n~\land~p^2\not\mid n\),则称 \(n\) 为 ...
- Powerful Number 筛法
我也不想学筛法了,可你考试时候出一个新筛法就不厚道了吧,我还开始以为这是杜教筛... $tips:$学完杜教筛立马学$Powerful \ Number$筛法,此筛法强悍如斯 $Powerful \ ...
- 「学习笔记」Min25筛
「学习笔记」Min25筛 前言 周指导今天模拟赛五分钟秒第一题,十分钟说第二题是 \(\text{Min25}\) 筛板子题,要不是第三题出题人数据范围给错了,周指导十五分钟就 \(\text{AK ...
- powerful number求积性函数前缀和
算法原理 本文参考了 zzq's blog . \(\text{powerful number}\) 的定义是每个质因子次数都 \(\ge 2\) 的数,有个结论是 \(\ge n\) 的 \(\te ...
- Java笔记:Number
序号 方法与描述 1 xxxValue()将number对象转换为xxx数据类型的值并返回. 2 compareTo()将number对象与参数比较. 3 equals()判断number对象是否与参 ...
随机推荐
- Json有什么作用?
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 它基于JavaScript(Standard ECMA-262 3rd Edition - Decemb ...
- 为什么要用 Dubbo?
随着服务化的进一步发展,服务越来越多,服务之间的调用和依赖关系也越来越 复杂,诞生了面向服务的架构体系(SOA), 也因此衍生出了一系列相应的技术,如对服务提供.服务调用.连接处理.通信 协议.序列化 ...
- 接口是否可继承(extends)接口?抽象类是否可实现 (implements)接口?抽象类是否可继承具体类(concrete class)?
接口可以继承接口,而且支持多重继承.抽象类可以实现(implements)接口,抽象类可继承具体类也可以继承抽象类.
- springBoot集成Elasticsearch抛出Factory method 'restHighLevelClient' threw exception; nested exception is java.lang.NoSuchFieldError: IGNORE_DEPRECATIONS
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'restHighLeve ...
- memcached 如何实现冗余机制?
不实现!我们对这个问题感到很惊讶.Memcached 应该是应用的缓存层.它的设 计本身就不带有任何冗余机制.如果一个 memcached 节点失去了所有数据,您 应该可以从数据源(比如数据库)再次获 ...
- 读懂jstack
1 jstack jstack是JDK自带的一种线程栈跟踪工具,用于生成java虚拟机当前时刻线程快照.在定位线程卡顿.死锁.block等原因的时候非常有用.使用方法是: jstack [-l] pi ...
- 前端性能优化(Application Cache篇)
正巧看到在送书,于是乎找了找自己博客上记录过的一些东西来及其无耻的蹭书了~~~ 小广告:更多内容可以看我的博客 之前在segmentfault上刷问题看到一个关于manifest的问题,很好奇就研究了 ...
- ubuntu root密码问题
安装完Ubuntu后忽然意识到没有设置root密码,不知道密码自然就无法进入根用户下.到网上搜了一下,原来是这麽回事.Ubuntu的默认root密码是随机的,即每次开机都有一个新的root密码.我们可 ...
- Java/C++实现策略模式---旅游出行方式
旅游的出行方式有乘坐飞机旅行.乘火车旅行和自行车游,不同的旅游方式有不同的实现过程,客户可以根据自己的需要选择一种合适的旅行方式. 类图: Java代码: public class Person { ...
- 在create-react-app使用less与antd按需加载
使用antd按需加载 使用react-app-rewired对 create-react-app 的默认配置进行自定义 yarn add react-app-rewired --dev /* pack ...