[笔记] 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对象是否与参 ...
随机推荐
- Dubbo 支持服务降级吗?
以通过 dubbo:reference 中设置 mock="return null".mock 的值也可以修改 为 true,然后再跟接口同一个路径下实现一个 Mock 类,命名规 ...
- spring-boot-EnvironmentPostProcessor
原理: 1-从启动类入口的run方法进入: public ConfigurableApplicationContext run(String... args) { -SpringApplication ...
- 什么情况下使用break关键字?什么情况下使用Continue关键字
return用于返回一个值给函数,或者直接使用,结束函数:break用于结束循环,即从循环中退出:continue用于结束当次循环,直接进行下次循环.
- PowerDesigner生成MySQL脚本,表和字段进行转义
打开Power Designer数据库建模工具,软件基本信息如下 如果PowerDesigner内置的(table_option)表物理操作没有,请看以下步骤 打开 Edit Current DBMS ...
- js--事件循环机制
前言 我们知道JavaScript 是单线程的编程语言,只能同一时间内做一件事,按顺序来处理事件,但是在遇到异步事件的时候,js线程并没有阻塞,还会继续执行,这又是为什么呢?本文来总结一下js 的事件 ...
- 遇到过的问题之“解决 No qualifying bean of type 问题”
1.问题 解决 No qualifying bean of type 问题 2.思路: 1 检查是否添加了对应注解 2 检查配置是否正确,扫描包名, 类名及id是否正确 一 . 传统SSM项目 ssm ...
- 超声波模块HC-SR04简介以及编程
HC-SR04 一.主要参数1:使用电压:DC-5V2:静态电流:小于2mA3:电平输出:高5V4:电平输出:底0V5:感应角度:不大于15度6:探测距离:2cm-450cm7:高精度 可达0.2cm ...
- centos下 Docker-修改磁盘存储目录(实操)
预备知识: Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linux 基金 ...
- 领域驱动模型DDD(二)——领域事件的订阅/发布实践
前言 凭良心来说,<微服务架构设计模式>此书什么都好,就是选用的业务过于庞大而导致代码连贯性太差,我作为读者来说对于其中采用的自研框架看起来味同嚼蜡,需要花费的学习成本实在是过于庞大,不仅 ...
- Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?
原始数据存储在 DB 中(如 MySQL.Hbase 等),但 DB 的读写性能低.延迟高. 比如 MySQL 在 4 核 8G 上的 TPS = 5000,QPS = 10000 左右,读写平均耗时 ...