数论函数这一块一直迷迷糊糊似懂非懂,最近花了点时间补了补基础知识
写这篇博客花了整整一下午的时间,希望哪天不记得的时候再翻这篇博客会有收获吧
前置知识
求和符号∑
i∑f(i)+g(i)i∑j∑f(i)g(j)i∑k∗f(i)=i∑f(i)+i∑g(i)=j∑i∑f(i)g(j)=(i∑f(i))∗(j∑g(j))=k∗i∑f(i)枚举约数转化为枚举倍数
i=1∑nd∣i∑f(d)=d=1∑ni=1∑⌊dn⌋f(d)=d=1∑n⌊dn⌋f(d)数论函数
积性函数
定义(最基本性质): ∀gcd(a,b)=1,满足 f(ab)=f(a)f(b)的函数。若去掉互质的条件仍满足,则为完全积性函数
性质:若 f(x),g(x)是积性函数,那么以下函数皆为积性函数
- h(x)=f(xp)
- h(x)=fp(x)
- h(x)=f(x)g(x)
- h(x)=∑d∣xf(d)g(dx)
常见积性函数:(令 n=p1a1p2a2⋯pkak)
- 单位元: ϵ(n)=[n=1]
- 恒等函数:1(n)=1
- 单位函数:Id(n)=n
- 莫比乌斯函数: μ(n)=[max(a1,a2,...,ak)≤1](−1)k
- 欧拉函数:φ(n)=∑i=1n[(i,n)=1]
- 约数个数函数: d(n)=∑d∣n1
- 约数和函数: σ(n)=∑d∣nd
- 刘维尔函数: λ(n)=(−1)k
线性筛
我们还是令 x=p1a1∗p2a2...pkak , 则根据积性函数的性质有 f(x)=f(p1a1)×f(p1a1x) 这个p1即为x的最小质因子
因此,对于任意的积性函数,若 f(pa) (p为质数) 可以快速求出,那么就可以线性筛.
例如:
φ(pa)=pa×pp−1
此处的证明:
φ(pa)表示小于pa的数中与pa互质的数
它等于pa减去与pa不互质的数
显然,与pa不互质的数一共有pa−1个,它们分别是1×p,2×p,3×p,...pa−1×p
所以φ(pa)=pa−pa−1=pa×pp−1
μ(pa)=−1[a=1]
d(pa)=a+1
σ(pa)=∑i=0api
具体φ的线性筛
狄利克雷卷积
定义: (f∗g)(n)=∑d∣nf(d)g(dn)
性质:
交换律:f∗g=g∗f
结合律:(f∗g)∗h=f∗(g∗h)
分配律:f∗(g+h)=f∗g+f∗h
单位元:f∗ϵ=ϵ∗f=f
常见关系:
- μ∗1=ϵ(即[n=1]=∑d∣nμ(d))
- Id=φ∗1⇒φ=μ∗Id(即n=∑d∣nφ(d),φ(n)=∑d∣ndnμ(d))
- d=1∗1⇒1=μ∗d
- σ=Id∗1⇒Id=μ∗σ
下面三个式子没那么容易一眼看出来,但是仔细推一推也是比较好理解的
σ=φ∗d
d(ij)=∑x∣i∑y∣j[gcd(x,y)=1]
σ(ij)=∑x∣i∑y∣j[gcd(xi,y)=1]xy
2018.12.18 Update
还是感性证明一下这个式子吧
首先,这个式子大致的意思是选i的一个约数和j的一个约数相乘
虽然得到的数一定是ij的约数,但是显然这样会算重
感性理解一下[gcd(xi,y)=1]这个条件实际上就是要满足对于任意一个质因子p,若在y中出现的话,x中就必须要取完
换句话说,如果p在最后的约数中的次数小于在i中的次数的话,那它只能在x中出现,y中不能出现;而如果大于在i中的次数的话,那么在x中的次数就必须等于在i中的次数
可以发现,这样做的话,相当于是p这个质因子按照先从i再从j的顺序进行选取,这样就保证了不会算重
∑i=1nμ2(i)=∑i=1⌊√n⌋μ(i)⌊i2n⌋(最后这个暂时没看太懂。。。)
欧拉函数φ
定义:φ(n)=∑i=1n[(i,n)=1]
另外一种计算方法:φ(n)=n∗i∏(1−pi1) (pi为n的质因子)
19.3.2 UPD
关于这个计算方法的证明
由上面线性筛的部分我们知道φ(pa)=pa×pp−1,且φ(n)=φ(p1a1)×φ(p2a2)×...×φ(pkak)
所以φ(n)=p1a1p2a2...pkak×i=1∏k(1−pi1)=n∗i=1∏k(1−pi1)
性质:n=∑d∣nφ(d)
感性证明:
考虑所有分母为n,分子为1,2,..,n的这n个分数
将分数约分后,分子分母是互质的,且分母是整除n的,且分数互不相同
对于每个不同的分母x,一定会有φ(x)个分子与其对应,于是得证
例如n=6时:
61,62,63,64,65,66约分后是
61,31,21,32,65,11其中φ(1)=1,φ(2)=1,φ(3)=2,φ(6)=2
运用(常见套路):
i∑j∑gcd(i,j)=i∑j∑d∣gcd(i,j)∑φ(d)
莫比乌斯函数μ
定义:μ(n)=[max(a1,a2,...,ak)≤1](−1)k
性质:[n=1]=∑d∣nμ(d)
证明:
显然n=1时∑d∣nμ(d)=1
n≠1时
d∣n∑μ(d)=μ(1)+μ(p1)+μ(p2)+...+μ(p1p2)+...+μ(p1p2...pk)=i=0∑kCki(−1)i=0最后一步是由二项式定理得到
(∑i=0kCki(−1)i1k−i=(1−1)n=0)
运用(常见套路):
i∑j∑[gcd(i,j)==1]=i∑j∑d∣gcd(i,j)∑μ(d)
莫比乌斯反演
其实主要内容上面都已经证明过了
定义:f(n)=∑d∣ng(d)⇒g(n)=∑d∣nμ(d)f(dn)
从卷积角度理解:
∵μ∗1∴μ∗f=1∗g∗μ=ϵ=ϵ∗g=g
- 扩展:f(n)=d∣n∑g(d)f(n)=n∣d∑g(d)⇒g(n)=d∣n∑μ(dn)f(d)⇒g(n)=n∣d∑μ(nd)f(d)
整除分块
容易发现,当 i=1...n 时,⌊in⌋ 只有 O(√n) 种不同的取值
这个性质经常被用来优化复杂度
具体操作是,如果当i∈[l,r]时的答案相同,那么当i=l时一次性算出这段区间的答案,然后令i=r+1,不断重复操作
举个最简单的例子:
求∑i=1n⌊in⌋
注意到,当i=l时,贡献为⌊ln⌋,而贡献为⌊ln⌋的最大的i显然等于⌊⌊ln⌋n⌋
即i∈[l,⌊⌊ln⌋n⌋]时,答案都为⌊ln⌋
那么把这部分答案O(1)算出来,再令i=⌊⌊ln⌋n⌋+1,重复此过程即可
因为⌊in⌋的取值是O(√n)的,所以复杂度时O(√n)的
杜教筛
杜教筛主要是用来快速求一些数论函数的前缀和
上面内容都理解了的话,杜教筛其实是非常简单的
Description
求某个数论函数f的前缀和F
n≤109
Solution
首先构造h=f∗g(g是一个任意的数论函数),设H为h的前缀和函数
开始疯狂推式子
H(n)=i=1∑nd∣i∑f(d)g(⌊di⌋)=i=1∑nd∣i∑g(d)f(⌊di⌋)=d=1∑ng(d)d∣i∑f(⌊di⌋)=d=1∑ng(d)i=1∑⌊dn⌋f(i)=d=1∑ng(d)F(⌊dn⌋)⇒F(n)g(1)=H(n)−i=2∑ng(i)F(⌊in⌋)
稍微解释一下上面式子怎么推的:
第一步:积性函数的交换律
第二步:把d提出来,枚举因数转化为枚举倍数
第三步:把枚举i转化为直接枚举⌊di⌋
第四步:根据F的定义代入
第五步:令d=1,代入
通过观察最后这个式子可以发现,后面部分可以整除分块,求F的话可以小范围线性筛预处理(大约107的表),大范围递归记忆化
那么只要H(n)能快速计算,就能做到低于线性(大约O(n32))的复杂度了(复杂度并不会证)
具体的,对于求不同的f,往往选择使得H更快更好求的函数h
比如:
筛μ:g=1,利用ϵ=1∗μ,此时F(n)=1−∑i=2nF(⌊in⌋)
筛φ:g=1,利用Id=1∗φ,此时F(n)=2n(n+1)−∑i=2nF(⌊in⌋)
代码及例题
「BZOJ1101」ZAP-Queries
「Luogu P3768」简单的数学题