0 参考(照抄)资料:#
1 线性筛求积性函数#
设现在要求一积性函数 f(x)。
当 x=pk,其中 p 为素数时,f(x) 不能由之前的 f 值转移,所以必须 O(1) 独立算出来。
其他情况下,x 一定能被表示为 pk×q,其中 p 为素数,k>0,q>1。此时,f(x)=f(pk)×f(q),可以在线性筛的过程中顺带求解。
2 数论分块#
2.1 数论分块简介#
数论分块一般用于处理如下形式的计算:∑ni=1f(i)g(⌊in⌋)。
当可以在 O(1) 的时间复杂度内计算出 ∑ri=lf(i) 时,原式便可以使用数论分块在 O(√n) 的时间复杂度内求解。
2.2 数论分块思想#
数论分块的思想其实是将 ⌊in⌋ 相同的数进行打包计算。我们考虑维护 l,r 表示 ⌊in⌋=k(k 为常数)的区间,然后这一段区间的和即为 g(k)×∑ri=lf(i)。当可以快速计算 ∑ri=lf(i) 时,上述式子便很容易计算。
2.3 引理 1#
Trick: ∀a,b,c∈Z,⌊abc⌋=⌊⌊ab⌋c⌋
Proof: 显然(?)
2.4 引理 2#
Trick: ∀n∈N+,∣∣{⌊nd⌋∣d∈N+,d≤n}∣∣≤⌊2√n⌋
Proof:
对于 d≤√n,⌊nd⌋ 至多有 √n 种取值。
对于 d>√n,⌊nd⌋≤√n,至多有 √n 种取值。
2.5 结论#
Trick: ⌊ni⌋=⌊nj⌋ 的 (j)max=⌊n⌊ni⌋⌋。
Proof:
不妨设 k=⌊ni⌋。
则 j×k≤n,得 j≤nk。
故 (j)max=⌊n⌊ni⌋⌋。
2.6 数论分块具体流程#
我们可以枚举 ⌊ni⌋ 的取值,对于每一个取值 k,找出对应值为 k 的区间 l,r。这一部分对答案的贡献就是 g(k)×∑ri=lf(i)。时间复杂度 O(√n)。
3 Dirichlet 卷积#
3.1 Dirichlet 卷积的定义#
对于两个数论函数 f(x),g(x),它们的 Dirichlet 卷积为:
h(x)=∑d∣xf(d)g(xd)=∑ab=xf(a)g(b)
上述可以简记为 h=f∗g。Dirichlet 卷积是数论函数的基本运算。
3.2 Dirichlet 卷积的性质#
一些小性质:Dirichlet 卷积具有 交换律,结合律,分配律。
4 欧拉函数#
4.1 欧拉函数定义#
φ(x)=x∑i=1[gcd(i,x)=1]
4.2 欧拉函数性质#
性质 1:当 p 为质数时,{φ(p)=p−1φ(pk)=pk−pkp=(p−1)pk−1
太简单了。不证。
性质 2:φ 为积性函数。
当 gcd(x,y)=1 时,容易发现 x,y 质因子不重合,于是当 φ(x) 与 φ(y) 两两匹配时,所诞生的数一定与 xy 互质。也就是说:
φ(xy)=φ(x)φ(y)
性质 3:φ∗1=id。
证明待补。
5 莫比乌斯函数#
5.1 莫比乌斯函数定义#
μ(n)=⎧⎨⎩1n=10n 含有平方因子(−1)kk 为 n 的本质不同质因子个数
感觉这个函数十分奇怪。但是它有很多奇妙的小性质。
5.2 莫比乌斯函数性质#
性质 1:μ(n) 为积性函数。
性质 2:∑d∣nμ(d)={1n=10n≠1
这个性质看着就非常舒服,因为它和 Dirichlet 卷积的形式有大部分重复。
证明待补。
性质 3:由性质 2 可以衍生出一个性质:μ∗1=ϵ。
证明:
h(n)=∑d | nμ(d)g(nd)=∑d | nμ(d)={1n=10n≠1
性质 4:[gcd(i,j)]=∑d | i,d | jμ(d)
为性质 2 的衍生结论,稍加推理即可。
5.3 莫比乌斯函数计算#
因为 μ(n) 为积性函数,所以可以用线性筛进行计算。时间复杂度 O(n)。
5.4 莫比乌斯反演#
现在有两个数论函数 f,g。
若 f(x)=∑d | xg(d),则 g=μ∗f,即 g(n)=∑d | xμ(d)f(nd)。
Proof:
∑d | nμ(d)f(nd)=∑d | nμ(d)∑d′ | ndg(d′)=∑d′ | ng(d′)∑d | nd′μ(d)=∑d | ng(d)[nd=1]=g(n)
6 杜教筛#
6.1 杜教筛概述#
杜教筛是一种用于在亚线性时间复杂度内求解数论函数的前缀和的一种算法。
6.2 杜教筛思想#
我们考虑构造两个数论函数 f,g。
我们设 Sg(x)=∑xi=1g(i),则有下列推导:
n∑i=1(f∗g)(i)=n∑i=1∑d | if(d)g(id)=n∑d=1⌊nd⌋∑p=1f(d)×g(p)=n∑d=1f(d)⌊nd⌋∑p=1g(p)=n∑d=1f(d)Sg(⌊nd⌋)
于是我们成功的化出了一个 g 的前缀和。由于我们现在想要知道 S(n) 的值,则可以如下转换:
f(1)S(n)=n∑d=1f(d)Sg(⌊nd⌋)−n∑d=2f(d)Sg(⌊nd⌋)=n∑i=1(f∗g)(i)−n∑d=2f(d)Sg(⌊nd⌋)
现在整理一下思路。如果我们能构造一个满足下列两条性质的数论函数 f,使得:
-
可以快速计算 ∑ni=1(f∗g)(i)。
-
∑nd=2f(d)Sg(⌊nd⌋) 非常的数论分块,于是需要可以快速计算 ∑ri=lf(i)。
如果可以,那么就可以较快的计算出 g 的前缀和。
6.3 杜教筛时间复杂度#
杜教筛的时间复杂度为 O(n23)。
吗的。不会证。
6.4 杜教筛应用#
先考虑如何计算 S(n)=∑ni=1μ(i)。
由 μ 函数的小性质,我们知道 μ(i)∗1=ϵ,于是有:
μ(1)S(n)=n∑i=1ϵ(i)−n∑d=2S(⌊nd⌋)S(n)=1−n∑d=2S(⌊nd⌋)
可以方便得计算。
再考虑如何计算 P(n)=∑ni=1φ(i)
显然也可以使用杜教筛计算。但是有更好得方法。
P(n)=n∑i=1φ(i)=n∑i=1i∑j=1[gcd(i,j)=1]=n∑i=1i∑j=1∑d | i,d | jμ(d)=n∑d=1μ(d)(⌊nd⌋)2
由于我们已经知道了 μ 的前缀和,所以此时显然可以直接数论分块。
7 Min_25 筛#
咕了。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂