简述 min_25 筛之前的积性函数求和基本技术
Carl Friedrich Gauss 曾说过,“凡是有自尊心的建筑师,在瑰丽的大厦建成之后,决不会把脚手架留在那里。”. 鉴于网上的杜教筛等等的博客其实写的不是很本质,在这里试图阐释一下杜教筛和 PN 筛的主要思路 .
(然而虽然我也可能写的不是很本质)
期望读者掌握基本的数论知识,如果读者认为本文存在内容的缺漏或错误,请在评论区指出,我会在收到后第一时间处理 .
(里面有些名字纯属笔者瞎编,没有什么科学依据)
1. 基本工具
1.1. 记号约定
积性函数:数论函数 \(f\) 满足 \(f(1)=1\),并且对于 \(n\perp m\) 满足 \(f(n\cdot m)=f(n)\cdot f(m)\) .
对于数论函数 \(f,g\),其 Dirichlet 卷积
\(\mathbb P\) 是素数集,\(\mathrm S\) 是前缀和算子,\(\Delta=\mathrm S^{-1}\) 是(平移一位的)差分算子 .
1.2. Dirichlet 生成函数
对于数论函数 \(f\),定义其 Dirichlet 生成函数(简称 DGF):
那么显然有 \(f*g\) 的 DGF 为 \(f,g\) 的 DGF 之积 .
Euler 乘积公式:对于积性函数 \(f\),其 DGF
严格证明比较复杂,可以纯粹感性理解一下(
Riemann-zeta 函数:\(\zeta(x)=\sum_{n\ge 1}\frac1{n^x}\) . 常见的 DGF:
- \(F(x-k)\):点乘 \(\mathrm{Id}_k\) .
- \(F(kx)\):\(x\) 位置的数移动到 \(x^k\) 位置 .
- \(\mathrm{Id}_k\):\(\zeta(x-k)\) .
- \(\mu\):\(\frac1{\zeta(x)}\) .
- \(\varphi\):\(\frac{\zeta(x-1)}{\zeta(x)}\) .
1.3. Bell 级数
对于积性函数 \(f\),定义其在素数 \(p\) 意义下的 Bell 级数:
那么显然有 \(f*g\) 的 Bell 级数为 \(f,g\) 的 Bell 级数之积 .
常见的 Bell 级数:
- \(F_p(cx)\):点乘 \(c^{\Omega}\) .
- \(F_p(p^kx)\):点乘 \(\mathrm{Id}_k\) .
- \(\mathrm{Id}_k\):\(\frac1{1-p^kx}\) .
- \(\mu\):\(1-x\) .
- \(\varphi\):\(\frac{1-x}{1-px}\) .
相对于 Dirichlet 生成函数,Bell 级数给出了积性函数在每一维上的具体表现 .
2. 杜教筛机理
2.1. 整除 Dirichlet 卷积
定义两个数论函数 \(f,g\) 的整除 Dirichlet 卷积
则有 \(f*g=h\iff f\mathbin\square \mathrm S g=\mathrm S h\),具体可以考虑
进一步可以通过 Möbius 反演导出 \(\square\) 的反演关系:
2.2. 块筛卷积
\(f\) 在 \(n\) 处的块筛就是说 \(\sum f\) 在每个 \(\lfloor\frac ni\rfloor\) 处的点值(容易发现总共只有不超过 \(2\sqrt n\) 个这样的位置) .
对于 \(f*g=h\),如果已知 \(f,g\) 的块筛,怎么求 \(h\) 的块筛?可以直接使用整除 Dirichlet 卷积和普通 Dirichlet 卷积的关系解决:
对于 \(f*g=h\),如果已知 \(f,h\) 的块筛,怎么求 \(f\) 的块筛?这样的技巧通常被称作“杜教筛”,可以对上式移项解决:
OI 中常见的杜教筛是这样的流程:如果通过某些技术能快速求出 \(g,h\) 的块筛,试图求 \(f\) 的块筛 . 只需线性筛预处理出 \(<n^{2/3}\) 的 \(f\),更大规模的 \(f\) 递归处理(需要通过某些技术每轮 \(\lfloor\frac ni\rfloor\) 相同的位置统一处理),这样容易通过积分分析出时间复杂度为 \(\Theta(n^{2/3})\) .
3. 稀疏块筛卷积
有没有感觉,杜教筛要知道两个块筛还是太昂贵了??
3.1. Powerful Number 筛
Powerful Number(简称 PN)是指每个素数的次数都不为 1 的数 . 根据 Bézout 定理可以简单导出 PN 即为形如 \(a^2b^3\) 的数 .
关键性质:不大于 \(n\) 的 PN 个数是 \(O(\sqrt n)\) 的,容易通过积分估阶:
容易发现,一个积性函数 \(f\) 只在 PN 处有值当且仅当它的 Bell 级数在模 \(x^2\) 意义下为 \(1\) .
对于积性函数 \(f\),如果构造函数 \(g\) 满足对于素数 \(p\) 有 \(f(p)=g(p)\)(素数拟合),则容易发现其 Bell 级数满足关系 \(F_p(x)\equiv G_p(x)\pmod{x^2}\),从而 \(h=f/g\) 显然只在 PN 处有值 .
使用块筛卷积的技术:
这里 \(h\) 只在 PN 处有值,这样的位置只有 \(O(\sqrt n)\) 个 . 那么如果能求出 \(g\) 的块筛就能在 \(O(\sqrt n)\) 时间内求出 \(h\) 的一处点值 . 这就是 OI 中通常被称为“Powerful Number 筛”的技术了 .
3.2. 完全平方筛
对于积性函数 \(f,g\)(其 Bell 级数为 \(F_p(x),G_p(x)\)),若 Bell 级数 \(\frac{G_p(x)}{F_p(-x)}\) 的前缀和和 Bell 级数 \(F_p(x)F_p(-x)\) 的单点可以快速计算,那么可以使用完全平方筛求 \(f*g\) 的前缀和 .
主要思路就是注意到
由于 \(F_p(x)F_p(-x)\) 是 \(x^2\) 的倍数,那么它只在完全平方数处有值 . 从而可以使用块筛卷积,过程类似 Powerful Number 筛,不再详细展开 .
下面以求 \(\mu^2*1\) 的前缀和演示这种技术的使用方法:取 \(f=\mu^2,\,g=1\),那么要求 \(f*g\) 的前缀和,此处 \(F_p(x)=1+x\) . 注意到:
那么只需要求 \(\frac1{(1-x)^2}\)(也就是约数个数函数 \(d\))的前缀和和 \((1-x^2)\) 的单点(平凡),如果使用 \(\Theta(\sqrt n)\) 的算法求 \(d\) 的前缀和,时间复杂度可以通过积分估阶:
如果使用 DIVCNT1 求 \(d\) 的前缀和,甚至可以去掉 log . 一个另外的例子 .
以下是博客签名,正文无关
本文来自博客园,作者:Jijidawang,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/18893629
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ

浙公网安备 33010602011771号