莫比乌斯反演

莫比乌斯反演主要用于快速计算一些阴间式子(包含 gcd ⁡ ( i , j ) \gcd(i,j) gcd(i,j) 等)。

至于如何应用,往下看。

莫比乌斯函数

μ ( x ) = { 1 x = 1 0 n 含有平方因子 ( − 1 ) k k 为 n 本质不同质因子个数 \mu(x)=\begin{cases}1&x=1\\ 0&n 含有平方因子\\ (-1)^k & k 为 n 本质不同质因子个数 \end{cases} μ(x)= 10(1)kx=1n含有平方因子kn本质不同质因子个数

假设 x = ∏ i = 1 k p i c i x = \prod\limits_{i=1}^{k}p_i^{c_i} x=i=1kpici,其中 p i p_i pi 为质数, c i ≥ 1 c_i \geq 1 ci1。( 20 = 2 2 × 5 20 = 2^2 \times 5 20=22×5)
x = 1 x= 1 x=1,则 μ ( x ) = 1 \mu(x) = 1 μ(x)=1
若存在 c i > 1 c_i >1 ci>1,则 μ ( x ) = 0 \mu(x) = 0 μ(x)=0
c i ≤ 1 c_i \leq 1 ci1,则 μ ( x ) = ( − 1 ) k \mu(x) = (-1)^k μ(x)=(1)k

由于莫比乌斯函数可以 O ( n ) O(n) O(n) 线性筛预处理,所以我们大可以将题目中的式子转化成包含莫比乌斯函数的式子。以此来减少计算时间复杂度。

性质

性质 #1

μ ∗ 1 = ϵ \mu * 1=\epsilon μ1=ϵ,即

∑ d ∣ n μ ( d ) = [ n = 1 ] \sum_{d|n}\mu(d)=[n=1] dnμ(d)=[n=1]

补充:狄利克雷卷积
函数 f ( x ) f(x) f(x) g ( x ) g(x) g(x) 的狄利克雷卷积 ( f ∗ g ) ( x ) = ∑ d ∣ x f ( x ) g ( x d ) (f * g)(x) = \sum\limits_{d|x}f(x)g(\frac{x}{d}) (fg)(x)=dxf(x)g(dx)
可以看成: ( f ∗ g ) ( x ) = ∑ i ∑ j f ( i ) g ( j ) [ i j = x ] (f * g)(x) = \sum\limits_{i}\sum\limits_{j}f(i)g(j)[ij=x] (fg)(x)=ijf(i)g(j)[ij=x]

补充:狄利克雷卷积单位元 ϵ \epsilon ϵ
ϵ ( x ) = [ x = 1 ] \epsilon(x)=[x=1] ϵ(x)=[x=1]
性质:对于任意一个函数 f f f,有 f ∗ ϵ = f f*\epsilon=f fϵ=f

性质 #2

μ ∗ d ⁡ = 1 \mu * \operatorname{d} =1 μd=1,即

∑ i ∣ n μ ( i ) d ⁡ ( n i ) = 1 \sum_{i|n}\mu(i)\operatorname{d}(\frac{n}{i}) = 1 inμ(i)d(in)=1

补充:约数个数函数 d ⁡ ( x ) \operatorname{d}(x) d(x)
d ⁡ ( n ) = n 的约数个数 = ∑ d = 1 n [ d ∣ n ] \operatorname{d}(n)=n的约数个数=\sum_{d=1}^{n}[d|n] d(n)=n的约数个数=d=1n[dn]

结论

套路
接下来我会讲一些结论以及其证明,通过这些结论和证明过程(还有你的思维技巧),可以解决一些莫反问题。

结论 #1

∑ i = 1 n ∑ j ∣ i f ( j ) = ∑ i f ( i ) ⌊ n i ⌋ \sum_{i=1}^{n}\sum_{j|i}f(j) = \sum_{i}f(i)\left\lfloor\frac{n}{i}\right\rfloor i=1njif(j)=if(i)in
此结论可以在和式后面的式子 f f f i i i 无关,但其有关的变量 j j j i i i 的因数时使用。
最后可以通过整除分块或者其他方法快速处理 ⌊ n i ⌋ \left\lfloor\frac{n}{i}\right\rfloor in

证明:

∑ i = 1 n ∑ j ∣ i f ( j ) \sum_{i=1}^{n}\sum_{j|i}f(j) i=1njif(j)
j ∣ i j|i ji 提出:
= ∑ i = 1 n ∑ j f ( j ) [ j ∣ i ] =\sum_{i=1}^{n}\sum_{j}f(j)[j|i] =i=1njf(j)[ji]
换位:
= ∑ j ∑ i = 1 n f ( j ) [ j ∣ i ] =\sum_{j}\sum_{i=1}^{n}f(j)[j|i] =ji=1nf(j)[ji]
j ∣ i j|i ji 塞回:
= ∑ j ∑ i = 1 , j ∣ i n f ( j ) =\sum_{j}\sum_{i=1,j|i}^{n}f(j) =ji=1,jinf(j)
i = j i ′ i = ji' i=ji,可以消去 j ∣ i j|i ji 条件:
= ∑ j ∑ i ′ = 1 , j i ′ ≤ n f ( j ) =\sum_{j}\sum_{i'=1,ji'\leq n}f(j) =ji=1,jinf(j)
由于 ( ∀ j i ′ ≤ n ) ( i ′ ≤ ⌊ n j ⌋ ) (\forall ji'\leq n)(i'\leq\left\lfloor\frac{n}{j}\right\rfloor) (jin)(ijn)
= ∑ j ∑ i ′ = 1 ⌊ n j ⌋ f ( j ) =\sum_{j}\sum_{i'=1}^{\left\lfloor\frac{n}{j}\right\rfloor}f(j) =ji=1jnf(j)
f ( j ) f(j) f(j) i i i 无关,所以:
= ∑ j f ( j ) ⌊ n j ⌋ =\sum_{j}f(j)\left\lfloor\frac{n}{j}\right\rfloor =jf(j)jn
换变量名:
= ∑ i f ( i ) ⌊ n i ⌋ =\sum_{i}f(i)\left\lfloor\frac{n}{i}\right\rfloor =if(i)in

结论 #2

∑ i = 1 n ∑ j = 1 ⌊ n i ⌋ f ( i , j ) = ∑ i = 1 n ∑ j ∣ i f ( j , i j ) \sum_{i=1}^{n}\sum_{j=1}^{\left\lfloor\frac{n}{i}\right\rfloor}f(i,j)=\sum_{i=1}^{n}\sum_{j|i}f(j,\frac{i}{j}) i=1nj=1inf(i,j)=i=1njif(j,ji)
此结论可以转换求和公式,从而尝试化简。

证明

读者自证不难。
∑ i = 1 n ∑ j = 1 ⌊ n i ⌋ f ( i , j ) \sum_{i=1}^{n}\sum_{j=1}^{\left\lfloor\frac{n}{i}\right\rfloor}f(i,j) i=1nj=1inf(i,j)
我们令 T = i j T = ij T=ij,则有:
= ∑ i = 1 n ∑ T = i , i ∣ T n f ( i , T i ) =\sum_{i=1}^{n}\sum_{T=i, i|T}^{n}f(i,\frac{T}{i}) =i=1nT=i,iTnf(i,iT)
由于 ( ∀ T < i ) ( i ∤   T ) (\forall T(T<i)(i T),有:
= ∑ i = 1 n ∑ T = 1 , i ∣ T n f ( i , T i ) =\sum_{i=1}^{n}\sum_{T=1, i|T}^{n}f(i,\frac{T}{i}) =i=1nT=1,iTnf(i,iT)
i ∣ T i|T iT 提出:
= ∑ i = 1 n ∑ T = 1 n f ( i , T i ) [ i ∣ T ] =\sum_{i=1}^{n}\sum_{T=1}^{n}f(i,\frac{T}{i})[i|T] =i=1nT=1nf(i,iT)[iT]
交换两个 Σ \Sigma Σ
= ∑ T = 1 n ∑ i = 1 n f ( i , T i ) [ i ∣ T ] =\sum_{T=1}^{n}\sum_{i=1}^{n}f(i,\frac{T}{i})[i|T] =T=1ni=1nf(i,iT)[iT]
i ∣ T i|T iT 再放入 i i i Σ \Sigma Σ 中提出:
= ∑ T = 1 n ∑ i = 1 , i ∣ T n f ( i , T i ) =\sum_{T=1}^{n}\sum_{i=1,i|T}^{n}f(i,\frac{T}{i}) =T=1ni=1,iTnf(i,iT)
由于 ( ∀ i > T ) ( i ∤   T ) (\forall i> T)(i\not|~T) (i>T)(i T),我们可以将 i = 1... n i=1...n i=1...n 的限制去掉:
= ∑ T = 1 n ∑ i ∣ T f ( i , T i ) =\sum_{T=1}^{n}\sum_{i|T}f(i,\frac{T}{i}) =T=1niTf(i,iT)
再换个变量名:
= ∑ i = 1 n ∑ j ∣ i f ( j , i j ) =\sum_{i=1}^{n}\sum_{j|i}f(j,\frac{i}{j}) =i=1njif(j,ji)

结论 #3

∑ i = 1 n ∑ j = 1 m [ gcd ⁡ ( i , j ) = 1 ] = ∑ d μ ( d ) ⌊ n d ⌋ ⌊ m d ⌋ \sum_{i=1}^{n}\sum_{j=1}^{m}[\gcd(i,j) =1] = \sum_{d}\mu(d)\left\lfloor\frac{n}{d}\right\rfloor\left\lfloor\frac{m}{d}\right\rfloor i=1nj=1m[gcd(i,j)=1]=dμ(d)dndm

终于遇到 μ \mu μ 了(

经典结论,用来化简 gcd ⁡ \gcd gcd 函数,其实其核心思想是 [ d ∣ gcd ⁡ ( i , j ) ] = [ d ∣ i ] [ d ∣ j ] [d|\gcd(i,j)]=[d|i][d|j] [dgcd(i,j)]=[di][dj]

证明:

∑ i = 1 n ∑ j = 1 m [ gcd ⁡ ( i , j ) = 1 ] \sum_{i=1}^{n}\sum_{j=1}^{m}[\gcd(i,j) =1] i=1nj=1m[gcd(i,j)=1]
莫比乌斯函数性质可转化为( ∑ d ∣ n μ ( d ) = [ n = 1 ] \sum\limits_{d|n}\mu(d)=[n=1] dnμ(d)=[n=1]):
= ∑ i = 1 n ∑ j = 1 m ∑ d ∣ gcd ⁡ ( i , j ) μ ( d ) =\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{d|\gcd(i,j)}\mu(d) =i=1nj=1mdgcd(i,j)μ(d)
由于 d ∣ g c d ( i , j ) ⇒ ( d ∣ i and ⁡ d ∣ j ) d|gcd(i,j) \Rarr (d|i \operatorname{and} d|j) dgcd(i,j)(dianddj) 可知:
= ∑ i = 1 n ∑ j = 1 m ∑ d ∣ i , d ∣ j μ ( d ) =\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{d|i,d|j}\mu(d) =i=1nj=1mdi,djμ(d)
根据结论 #2,有:
= ∑ d μ ( d ) ⌊ n d ⌋ ⌊ m d ⌋ =\sum_{d}\mu(d)\left\lfloor\frac{n}{d}\right\rfloor\left\lfloor\frac{m}{d}\right\rfloor =dμ(d)dndm
也可以等于
= ∑ d = 1 n μ ( d ) ⌊ n d ⌋ ⌊ m d ⌋ =\sum_{d=1}^{n}\mu(d)\left\lfloor\frac{n}{d}\right\rfloor\left\lfloor\frac{m}{d}\right\rfloor =d=1nμ(d)dndm

结论 #4

f ( x ) = ∑ i i [ f ( x ) = i ] f(x)=\sum_{i}i[f(x)=i] f(x)=ii[f(x)=i]
使用此结论可以把一些函数的求和转换为判断,例如: gcd ⁡ ( i , j ) \gcd(i,j) gcd(i,j)(这是最常见的操作)。

证明

留作习题
那么由于 i i i 可以取任何值,而且任何值只会取一次。所以只有一个 i i i 满足 i = f ( x ) i=f(x) i=f(x)

  • i ≠ f ( x ) i\not=f(x) i=f(x) 时, i [ f ( x ) = i ] = 0 i[f(x)=i]=0 i[f(x)=i]=0
  • i = f ( x ) i=f(x) i=f(x) 时, i [ f ( x ) = i ] = i = f ( x ) i[f(x)=i]=i=f(x) i[f(x)=i]=i=f(x)

所以 f ( x ) = ∑ i i [ f ( x ) = i ] f(x)=\sum\limits_{i}i[f(x)=i] f(x)=ii[f(x)=i]

结论 #5

f ( x ) = ∏ i i [ f ( x ) = i ] f(x)=\prod_{i}i^{[f(x)=i]} f(x)=ii[f(x)=i]
使用此结论可以把一些函数的连乘转换为判断,例如: gcd ⁡ ( i , j ) \gcd(i,j) gcd(i,j)。也是常见套路。

更好的是这种转换可以将函数丢到指数位置上,从而把 Π \Pi Π 变成 Σ \Sigma Σ

例如:

∏ i n ∏ j m gcd ⁡ ( i , j ) = ∏ d ∏ i n ∏ j m d [ gcd ⁡ ( i , j ) = d ] = ∏ d d ∑ i n ∑ j m [ gcd ⁡ ( i , j ) = d ] \prod_{i}^{n}\prod_{j}^{m}\gcd(i,j)=\prod_{d}\prod_{i}^{n}\prod_{j}^{m}d^{[\gcd(i,j)=d]} = \prod_{d}d^{\sum\limits_{i}^{n}\sum\limits_{j}^{m}[\gcd(i,j)=d]} injmgcd(i,j)=dinjmd[gcd(i,j)=d]=ddinjm[gcd(i,j)=d]

证明

留作习题
那么由于 i i i 可以取任何值,而且任何值只会取一次。所以只有一个 i i i 满足 i = f ( x ) i=f(x) i=f(x)

  • i ≠ f ( x ) i\not=f(x) i=f(x) 时, i [ f ( x ) = i ] = 1 i^{[f(x)=i]}=1 i[f(x)=i]=1
  • i = f ( x ) i=f(x) i=f(x) 时, i [ f ( x ) = i ] = i = f ( x ) i^{[f(x)=i]}=i=f(x) i[f(x)=i]=i=f(x)

所以 f ( x ) = ∏ i i [ f ( x ) = i ] f(x)=\prod\limits_{i}i^{[f(x)=i]} f(x)=ii[f(x)=i]

结论 #6

d ⁡ ( n m ) = ∑ i ∣ n ∑ j ∣ m [ g c d ( i , j ) = 1 ] \operatorname{d}(nm) = \sum_{i|n}\sum_{j|m}[gcd(i,j)=1] d(nm)=injm[gcd(i,j)=1]

未完待续。

快速计算

当我们通过上面的结论推导出一个式子时,可以通过暴力计算得到答案。

但是显然,一般情况下,这样做时间复杂度较高。虽然已经比暴力算原式快了不少

所以我们可以通过预处理和前缀和或者其他方式(线段树动态维护等)来降低时间复杂度。

欧拉筛(线性筛)

可以 O ( n ) O(n) O(n) 时间内筛出大部分积性函数 [ 1 , n ] [1,n] [1,n] 的值。

线性筛 μ \mu μ

最常用的,就是筛莫比乌斯函数 μ \mu μ,因为一反演就基本上会用到 μ \mu μ

μ \mu μ 为积性函数,所以若 g c d ( a , b ) = 1 gcd(a,b) = 1 gcd(a,b)=1,则 μ ( a b ) = μ ( a ) μ ( b ) \mu(ab)=\mu(a)\mu(b) μ(ab)=μ(a)μ(b)

为了筛 μ \mu μ,我们考虑当 p p p 为质数时, μ ( p ) \mu(p) μ(p) 的取值。显然 μ ( p ) = − 1 \mu(p) = -1 μ(p)=1

那么再考虑当 p p p 为质数, p ∣ a p|a pa 时, μ ( a p ) \mu(ap) μ(ap) μ ( a ) , μ ( p ) \mu(a),\mu(p) μ(a),μ(p) 的关系。显然由于 a a a 中已经包含质因子 p p p,所以 a p ap ap 的质因子 p p p 的幂一定大于等于 2 2 2。所以 μ ( a p ) = 0 \mu(ap) = 0 μ(ap)=0

于是可以轻而易举的筛出 μ \mu μ

线性筛

线性筛 ϕ \phi ϕ

未完待续。

例题

了解完如何运用莫比乌斯反演和预处理降低时间复杂度后,我们来做点例题。

未完待续。

你可能感兴趣的:(数学,算法与数据结构,算法)