定义

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;
}
}

[笔记] Powerful Number 筛的更多相关文章

  1. Powerful Number 筛学习笔记

    Powerful Number 筛学习笔记 用途 \(Powerful\ number\) 筛可以用来求出一类积性函数的前缀和,最快可以达到根号复杂度. 实现 \(Powerful\ number\) ...

  2. powerful number筛

    心血来潮跑来实现以下这个东西 我们应该知道杜教筛的理论是 \(f * g=h\),那么问题在于如何找 \(g\). 之前的blog应该提到过可以令 \(g(p)=-f(p)\),这样一来 \(h\) ...

  3. Powerful Number 学习笔记

    定义 对于一个正整数 \(n\) ,若完全分解之后不存在指数 \(=1\) ,则称 \(n\) 为 \(\text{Powerful Number}\) . 可以发现的是,在 \([1,n]\) 中, ...

  4. 利用powerful number求积性函数前缀和

    好久没更博客了,先水一篇再说.其实这个做法应该算是杜教筛的一个拓展. powerful number的定义是每个质因子次数都 $\geq 2$ 的数.首先,$\leq n$ 的powerful num ...

  5. Note - Powerful Number

    Powerful Number   对于 \(n\in\mathbb N_+\),若不存在素数 \(p\) 使得 \(p\mid n~\land~p^2\not\mid n\),则称 \(n\) 为 ...

  6. Powerful Number 筛法

    我也不想学筛法了,可你考试时候出一个新筛法就不厚道了吧,我还开始以为这是杜教筛... $tips:$学完杜教筛立马学$Powerful \ Number$筛法,此筛法强悍如斯 $Powerful \ ...

  7. 「学习笔记」Min25筛

    「学习笔记」Min25筛 前言 周指导今天模拟赛五分钟秒第一题,十分钟说第二题是 \(\text{Min25}​\) 筛板子题,要不是第三题出题人数据范围给错了,周指导十五分钟就 \(\text{AK ...

  8. powerful number求积性函数前缀和

    算法原理 本文参考了 zzq's blog . \(\text{powerful number}\) 的定义是每个质因子次数都 \(\ge 2\) 的数,有个结论是 \(\ge n\) 的 \(\te ...

  9. Java笔记:Number

    序号 方法与描述 1 xxxValue()将number对象转换为xxx数据类型的值并返回. 2 compareTo()将number对象与参数比较. 3 equals()判断number对象是否与参 ...

随机推荐

  1. xml文件使用DOM解析,报异常org.xml.sax.SAXParseException,"characterEncoding" 的引用必须以 ';' 分隔符结尾异常

    这个异常一般为xml文件对&的报错,只需要将&改为转义后的&amp即可解决

  2. okayNav jQuery 插件怎么使用

    首先到 https://github.com/VPenkov/okayNav 这个网站里面把代码下载下来 下载之后解压出来,解压后打开文件app 然后创建一个HTML文档 然后倒入css的样式 样式: ...

  3. 学习Apache(一)

    实验目的 通过apache实现反向代理的功能,类似nginx反向代理和haproxy反向代理 环境准备 逻辑架构如下 前端是apche服务器,监听80端口,后端有两台web服务器,分别是node1和n ...

  4. 纯CSS实现扁平化风格开关按钮

    开关样式预览图 前言 最近在基于bootstrap框架开发一个网站,在填写表单一项需要用户填写是否选择某一选项,本来想引用bootstrap框架自带的一个按钮插件,结果在引用js的时候总是出错,就找了 ...

  5. ES6-11学习笔记--const

    新声明方式:const 1.不属于顶层对象 window 2.不允许重复声明 3.不存在变量提升 4.暂时性死区 5.块级作用域   以上特性跟let声明一样,特性可看 let 的学习笔记:链接跳转 ...

  6. 高频重要前端API手写整理(call,apply,bind,instanceof,flat,filter,new,防抖,节流,深浅拷贝,数组乱序,数组去重,继承, lazyman,jsonp的实现,函数的柯里化 )

    Function.prototype.call = function(context,...args){ var context = context || window; context.fn = t ...

  7. python---括号匹配

    """ 括号匹配 输入: "()[]{}" 输出true 输入:"([)]" 输出false 输入:")(()))&qu ...

  8. SSM实现个人博客-day01

    1.需求分析 项目源码免费下载:SSM实现个人博客 有问题请询问vx:kht808

  9. 索引优化、Sql查询语句优化

    工作中我们经常会遇到系统查询慢的情况,一般我们会采取好多方法进行优化,如建立索引,优化查询Sql,分表,规范数据表结构设计,调整数据库参数(内存分配.缓存等),增加硬件配置,优化网络环境等.下面介绍两 ...

  10. java基础知识-序列化/反序列化-gson基础知识

    以下内容来之官网翻译,地址 1.Gson依赖 1.1.Gradle/Android dependencies { implementation 'com.google.code.gson:gson:2 ...