数论筛法小记
会挖坑,好让复习的时候长脑子。
很多证明只是提两句,因为给自己看,以免复习时没有思路。
以下所有
基础(Base)
唯一分解定理(算术基本定理):
后面默认都分解了。
积性函数:
完全积性函数:
完全积性函数出现的比较少,不过积性函数也较好处理,可以线性筛。
经典的积性函数:
-
:欧拉函数。有性质 和 。第一个考虑
的取值,发现是 就很好说明。第二个考虑
这一串数的个数,化成最简分数来算。 -
:莫比乌斯函数。原始定义是 。根据定义可得:
-
与 及 :约数个数函数 与 约数和函数 及 除数函数。其实
就是 ……表述可以是:
。
一些比较牛逼的完全积性函数:
,依夫瑟洛!:狄利克雷卷积下的单位元, 。 :单位函数, 。 与 :就是走个形式, 。
别的先不谈,考虑怎么算积性函数。
简单筛(Sieve base)
计算原理
其实说筛之前应该先看一下积性函数的计算原理。
由于算术基本定理,任意数都可以表为若干个质数的次幂乘积。
因此我们只要分解
由于分解难,往往是
然而另一种思路是主动去凑
这样就成了筛法。
线性筛。
埃筛 is too naive。
线性筛使得每个数字只被自己的最小质因子筛一次,过程如下:
Note: This is not pseudocode!
- If i is a prime
- Add i into the P
- For all pri in P
- Calc x=i*p
- if p is a divisor of i
* Calc x by p and i,then break
- else f(x)=f(i)*f(p)
关键步骤在 * 一句,我们需要根据
可以使用无脑做法:
注意像
这个基本就是线性筛积性函数的普适做法,感觉其实非常地简单但我当初就是听不懂。
狄利克雷卷积(Dirichlet Convolution)
狄利克雷卷积(以下简称卷积),定义如下:
若
卷积满足交换律:
同时满足结合律:
一些常见的卷积:
上面这些都可以拆式子得到。
比较重要的,卷积结合点乘的特殊规律:
考虑证明:
显然成立。
整除分块(Sqrt Decomposition)
现在补充这个 trick。
考虑一个形如:
不难发现,
那么能否拆成若干段来加速?
- 对于
, 的取值只有 种。 - 对于
, ,因此取值也只有 种。
枚举每一段左右端点,取另一函数区间和(可用前缀和相减得到),乘上即可。
然后怎样根据
不难发现,由于
然后分完一整段则是
代码如下 (放弃了鬼畜的流程表述):
for(int l=1,r;l<=n;l=r+1)
r=(n/(n/l)),ans=(sum[r]-sum[l-1])*func(n/l);
扩展:若存在
这个东西用处很多,比如在能快速求某一函数前缀和,或
杜教筛!(Du)
杜教筛用于在亚线性时间内求积性函数前缀和。
思路:构造
记
不难发现形成了递归式,变一下式子即可得到
然后运用整除分块,即可直接做。
需要 (有时或可筛套筛?)。
复杂度我不会证,似乎要用到微积分,CSP 完了学一下。
如果预处理前
不要求是积性函数,能卷就行。
Trick
也许是重点。
这种情况可以把
这个推导在直观上很对,但不难发现直观理解出来,枚举的量既有重又有漏。
但是我们考虑
- 若
,钦定全部用 中的 ;此时 含有因子 , 不含。 - 若
,钦定用完 中的 ,然后使用 中的 个 ;此时 含有因子 ,并强制令 不含。
也就是说当
两种情况下都做到了
故上式正确,同时也可解释为何在算约数和时不能直接套用此法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!