数论函数
在数论上,数论函数指定义域为正整数的函数。
积性与完全积性
如果一个数论函数 f 满足 ∀n,m≥1,gcd(n,m)=1 f(nm)=f(n)f(m),则称这个函数是积性的。
如果一个数论函数 f 满足 ∀n,m≥1 f(nm)=f(n)f(m),则称这个函数是完全积性的。
根据定义,所有完全积性函数的集合是所有积性函数的集合的子集。
一些重要的数论函数
- φ(n) 表示多少个数小于等于 n 且与 n 互质。
- τ(n) 表示 n 的约数个数。
- σ(n) 表示 n 的约数之和。
- dk(n) 表示约数 k 次方和,即 ∑d∣ndk。且 τ=d0,σ=d1。
- μ(n) 对于有平方因子的数为 0,否则有奇数 / 偶数个质因数时为 −1/1。
- Idk(n) 为 nk。
- ϵ(n) 为 [n=1]。
可以证明,以上数论函数都是积性函数。
线性筛求积性函数
根据积性函数的定义,只要我们可以求出所有 f(pk) 的值(p 为质数,k 为正整数),我们就可以用线性筛筛出积性函数 f。
举几个例子:假设 n 的质因数分解为 n=∏i=1mpiai,那么:
- 根据积性函数的性质,φ(n)=∏i=1mφ(piai)=∏i=1m(piai−piai−1)。
- 根据积性函数的性质,τ(n)=∏i=1mτ(piai)=∏i=1m(ai+1)。
- 根据积性函数的性质,σ(n)=∏i=1mσ(piai)=∏i=1m(1+pi+pi2+⋯+piai)。
在 φ 中,φ(pk)=pk−pk−1;在 τ 中,τ(pk)=k+1;在 σ 中,σ(pk)=1+p+p2+⋯+pk。
这三个值都可以计算,所以它们可以用线性筛筛出。
那效率怎么样呢?我们知道,线性筛递推一次的时间复杂度为 O(n),而 1∼n 中大概有 lognn 个形如 pk 的数,设求 f(pk) 的时间复杂度为 t,那么总时间复杂度为 O(n+lognnt)。
所以,如果 t 至多为为 O(logn) 级别,时间复杂度为线性。
数论函数的运用
求 ∑j=1n∑i=j+1ngcd(i,j)。
推一下柿子:
j=1∑ni=j+1∑ngcd(i,j)=d=1∑ndj=1∑ni=j+1∑n[gcd(i,j)=d](枚举 gcd 的值 d)=d=1∑ndj=1∑⌊nd⌋i=j+1∑⌊nd⌋[gcd(i,j)=1](i 变为 i / d,j 变为 j / d)=d=1∑ndi=1∑⌊nd⌋j=1∑i−1[gcd(i,j)=1](由于 gcd 有交换律,所以可以交换 i, j)=d=1∑ndi=1∑⌊nd⌋φ(i)(最后一个求和转变为欧拉函数)
线性筛出 φ 并做前缀和即可线性求出答案。
上面推式子过程中枚举 gcd 是一个很重要的技巧。
例题
[SDOI2008] 仪仗队
[SDOI2008] 沙拉公主的困惑
GCD
Dirichlet 卷积
对于两个数论函数 f,g,它们的 Dirichlet 卷积 h=f∗g 被定义为 h(n)=∑d∣nf(d)g(n/d)。
这个卷积满足交换律和结合律,则 f∗g=g∗f,(f∗g)∗h=f∗(g∗h)。
关于上面的数论函数,有一些性质:
-
ϵ∗f=f,其中 f 为任意数论函数。(即,ϵ 是 Dirichlet 卷积的单位元)
证明
把卷积的式子写出来是这样的:∑d∣nϵ(d)f(n/d)。只有 d=1 时 ϵ(d)=1,所以成立。
-
dk=Idk∗Id0。(我们还可以推出 τ=Id0∗Id0,σ=Id1∗Id0)
证明
把卷积的式子写出来是这样的:∑i∣nik=dk(n),与 dk 的定义一致。
-
φ∗Id0=Id1。
证明
想证明这个,其实就是证明 ∑d∣nφ(d)=n。
我们考虑下列 n 个分数:n1,n2,…,nn。
把它们都约分至最简形式。显然约分之后的分母只会是 n 的因数。
对于每个因数 x,这些分数里分母为 x 的分数显然有 φ(x) 个。而且所有分数一共有 n 个,所以原命题成立。
-
μ∗Id0=ϵ(非常重要!)
证明
如果 n 可以被质因数分解为 n=∏i=1mpiai,那么 n 的一个约数 d 可以被质因数分解为 d=∏i=1mpibi,且 ∀i∈[1,m] 0≤bi≤ai。
如果有任意一个 bi≥2,则 μ(d)=0,这是没有意义的,所以我们只考虑所有 bi≤1 的情况。
如果 m≥1(即 n>1),bi 之和为奇数与和为偶数的情况是一样的,都有 2m−1 种,所以会抵消,即 ∑d∣nμ(d)=0。
否则,∑d∣1μ(d) 即为 μ(1)=1。
这与 ϵ 的定义一致,原命题成立。
根据前面的 μ∗Id0=ϵ,可以得出 [n=1]=∑d∣nμ(d),这可以帮助推出题目式子。
运用
题意:求 ∑i=1n∑j=1nlcm(i,j)。
推一下柿子:
j=1∑ni=j+1∑nlcm(i,j)=i=1∑nj=1∑ngcd(i,j)ij(比较显然的一步)=d=1∑ni=1∑⌊dn⌋j=1∑⌊dn⌋[gcd(i,j)=1]dij(还是枚举 gcd 值 d,i 变为 i / d,j 变为 j / d)=d=1∑ndi=1∑⌊dn⌋j=1∑⌊dn⌋ijk∣gcd(i,j)∑μ(k)(把 i, j, d 提出,再用莫比乌斯反演)=d=1∑ndk=1∑⌊dn⌋μ(k)i=1∑⌊dkn⌋j=1∑⌊dkn⌋ijk2(把 k 放到前面枚举,i 变为 i / k / d,j 变为 j / k / d)=d=1∑ndk=1∑⌊dn⌋μ(k)k2(2⌊dkn⌋(⌊dkn⌋+1))2(后面两个求和可以用等差数列求和公式化简)=t=1∑nk∣t∑μ(k)k2kt(2⌊tn⌋(⌊tn⌋+1))2(前面的 t 为原本的 d * k,改为枚举 t 和 k,d 也就是 t / k)=t=1∑nk∣t∑μ(k)tk(2⌊tn⌋(⌊tn⌋+1))2(化简一下)=t=1∑nt(2⌊tn⌋(⌊tn⌋+1))2k∣t∑μ(k)k(把带 t 的项移到前面)
至此,我们只需要求出 ∑k∣tμ(k)k 即可实现 O(n) 计算答案。
然后我们发现这玩意也是积性函数,所以可以直接线性处理,时间复杂度为 O(n)。
例题
「MCOI-02」Convex Hull 凸包
[POI2007] ZAP-Queries
[HAOI2011] Problem b
[SDOI2015] 约数个数和
简单题 / 加强版
Cowslip Collections
[SDOI2017] 数字表格
[MtOI2019] 幽灵乐团 / 莫比乌斯反演基 础 练 习 题