莫比乌斯反演!

在平时,我们经常会需要对带 gcd ⁡ \gcd gcd 的和式进行处理,然而, gcd ⁡ \gcd gcd 实在难以处理,所以我们一般退而求其次,改为枚举 gcd ⁡ \gcd gcd,然而,这也不是个很好的办法,因为我们无法很快的求出有哪些数对 ( x , y ) (x, y) (x,y) 满足 gcd ⁡ ( x , y ) = k \gcd(x, y) = k gcd(x,y)=k,而处理带 gcd ⁡ \gcd gcd 的和式的一大杀器便是莫比乌斯反演,所以我们来介绍一下。

文章目录

  • 莫比乌斯函数
  • 莫比乌斯函数的重要等式
  • 莫比乌斯反演公式
  • 莫比乌斯反演的作用
  • 另一个反演法
  • 另一个反演法的应用
  • 后记

莫比乌斯函数

首先定义这样一个函数 μ ( x ) \mu(x) μ(x),它满足:
μ ( 1 ) = 1 \mu(1) = 1 μ(1)=1
x x x 存在平方数因子的时候,即当存在整数 d d d 满足 d 2 ∣ x d^2|x d2x 时, μ ( x ) = 0 \mu(x) = 0 μ(x)=0;
否则, x x x 可以写成若干素数的乘积的形式,假设 x = p 1 p 2 … p n x = p_1p_2\dots p_n x=p1p2pn,则 μ ( x ) = ( − 1 ) n \mu(x) = (-1)^n μ(x)=(1)n;

其中 ∣ | 符号为整除,表示 x % d 2 = 0 x \% d^2 = 0 x%d2=0;

不难发现 μ ( x ) \mu(x) μ(x) 其实是一个积性函数,我们可以很容易地通过线性筛来求它。

莫比乌斯函数的重要等式

这样定义的 μ ( x ) \mu(x) μ(x) 满足一个非常良好的性质,即:
[ x = 1 ] = ∑ d ∣ x μ ( d ) [x = 1] = \sum_{d|x}\mu(d) [x=1]=dxμ(d)

其中 [ p ] [p] [p] 表示当 p p p 为真时结果为 1 1 1,当 p p p 为假时结果为 0 0 0
后边的 ∑ \sum 表示求和符号,即所有满足 d ∣ x d|x dx 的整数 d d d,对 μ ( d ) \mu(d) μ(d) 进行求和。

这个结果可能并不是那么显然,我们将 x = 1 x = 1 x=1 带入验证试一下,化简后得到 1 = μ ( 1 ) 1 = \mu(1) 1=μ(1),这似乎是没问题的。

x ≠ 1 x \neq 1 x=1 时,我们不妨设 x = p 1 r 1 p 2 r 2 … p k r k x = p_1^{r_1}p_2^{r_2}\dots p_k^{r_k} x=p1r1p2r2pkrk,我们发现,只有当 d d d 为若干素数的乘积的时候才会对整个和式产生贡献,此时 d = p 1 r 1 ′ p 2 r 2 ′ … p k r k ′ d = p_1^{r'_1}p_2^{r'_2}\dots p_k^{r'_k} d=p1r1p2r2pkrk,其中对任意 1 ≤ i ≤ k 1 \leq i \leq k 1ik r i ′ r'_i ri 的值为 1 1 1 0 0 0

那么我们不妨枚举 r i ′ r'_i ri 1 1 1 的个数,以另一种形式对这个和式进行求和,得到:

[ x = 1 ] = ∑ i = 0 k C k i ( − 1 ) i = ( 1 − 1 ) k = 0 [x = 1] = \sum_{i = 0}^kC_k^i(-1)^i = (1 - 1)^k = 0 [x=1]=i=0kCki(1)i=(11)k=0

至此,这个等式就得到了证明。

为什么说这个等式重要呢,因为我们可以通过这个等式推导出许多东西。

莫比乌斯反演公式

对于一个函数 f ( n ) f(n) f(n),我们可以利用 μ ( x ) \mu(x) μ(x) 来改写它的形式,具体来说,我们有如下等式:
f ( n ) = ∑ d ∣ n [ d = n ] f ( d ) f(n) = \sum_{d|n}[d = n]f(d) f(n)=dn[d=n]f(d)

这是非常显然的,然后我们进一步对其推导:

f ( n ) = ∑ d ∣ n [ n d = 1 ] f ( d ) f(n) = \sum_{d|n}[\frac nd = 1]f(d) f(n)=dn[dn=1]f(d)

直接把 [ n d = 1 ] [\frac nd = 1] [dn=1] μ \mu μ 函数展开,得到:

f ( n ) = ∑ d ∣ n ∑ k ∣ n d μ ( k ) f ( d ) f(n) = \sum_{d|n}\sum_{k|\frac nd}\mu(k)f(d) f(n)=dnkdnμ(k)f(d)

交换 k k k d d d 的求和顺序,得到:

f ( n ) = ∑ k ∣ n μ ( k ) ∑ d ∣ n k f ( d ) f(n) = \sum_{k|n}\mu(k)\sum_{d|\frac nk}f(d) f(n)=knμ(k)dknf(d)

如果说,我们设
g ( n ) = ∑ d ∣ n f ( d ) g(n) = \sum_{d|n}f(d) g(n)=dnf(d)

可以得到:

f ( n ) = ∑ k ∣ n μ ( k ) g ( n k ) f(n) = \sum_{k|n}\mu(k)g(\frac nk) f(n)=knμ(k)g(kn)

我们不习惯用 k k k 来枚举因数,改成用 d d d,就可以得到莫比乌斯反演的结论了,即:

g ( n ) = ∑ d ∣ n f ( d ) g(n) = \sum_{d|n}f(d) g(n)=dnf(d)

那么便有:

f ( n ) = ∑ d ∣ n μ ( d ) g ( n d ) f(n) = \sum_{d|n}\mu(d)g(\frac nd) f(n)=dnμ(d)g(dn)

一定成立。

这里关于 f ( n ) , g ( n ) f(n),g(n) f(n),g(n) 还有一个性质:这两个函数中如果有一个函数是积性函数,那么另一个函数也一定是积性函数。

事实上,设

h ( n ) = ∑ d ∣ n f ( d ) g ( n d ) h(n) = \sum_{d|n}f(d)g(\frac nd) h(n)=dnf(d)g(dn)

如果 f ( n ) , g ( n ) f(n), g(n) f(n),g(n) 都是积性函数,那么 h ( n ) h(n) h(n) 一定是积性函数,这一点并不难证明:

假设 a , b a, b a,b 互质,那么他们的任意两个因数一定互质,所以我们进行如下推导:

h ( a ) h ( b ) = ∑ d ∣ a f ( d ) g ( a d ) ∑ k ∣ b f ( k ) g ( b k ) h(a)h(b) = \sum_{d|a}f(d)g(\frac ad)\sum_{k|b}f(k)g(\frac bk) h(a)h(b)=daf(d)g(da)kbf(k)g(kb)

= ∑ d ∣ a ∑ k ∣ b f ( d ) f ( k ) g ( a d ) g ( b k ) = \sum_{d|a}\sum_{k|b}f(d)f(k)g(\frac ad)g(\frac bk) =dakbf(d)f(k)g(da)g(kb)

= ∑ d k ∣ a b f ( d k ) g ( a b d k ) = h ( a b ) = \sum_{dk|ab}f(dk)g(\frac{ab}{dk}) = h(ab) =dkabf(dk)g(dkab)=h(ab)

我们称这样的函数 h h h 为函数 f f f 和函数 g g g狄利克雷卷积,记作 h = f ∗ g h = f * g h=fg,狄利克雷卷积支持交换律结合律,然而一般情况下,它最大的作用就是两个积性函数的卷积一定是一个积性函数,通常用来证明一个函数是否是积性函数。

莫比乌斯反演的作用

说了这么多,莫比乌斯反演到底怎么处理带 gcd ⁡ \gcd gcd 的和式呢?
gcd ⁡ \gcd gcd 有一个非常良好的性质,那就是 d ∣ i d|i di d ∣ j d|j dj d ∣ gcd ⁡ ( i , j ) d|\gcd(i,j) dgcd(i,j) 的充要条件,也就是说,如果我们把 gcd ⁡ ( i , j ) \gcd(i, j) gcd(i,j) 弄到条件上,就可以轻松去掉这个 gcd ⁡ \gcd gcd 了。

我们来看一下如下的和式:

∑ i = 1 n ∑ j = 1 m gcd ⁡ ( i , j ) \sum_{i = 1}^n\sum_{j = 1}^m\gcd(i, j) i=1nj=1mgcd(i,j)

我们可以找到一个函数 f ( n ) f(n) f(n) 满足
n = ∑ d ∣ n f ( d ) n = \sum_{d|n}f(d) n=dnf(d)

利用莫比乌斯反演,得到

f ( n ) = ∑ d ∣ n μ ( d ) n d f(n) = \sum_{d|n}\mu(d)\frac nd f(n)=dnμ(d)dn

由狄利克雷卷积的性质我们知道 f ( n ) f(n) f(n) 是一个积性函数,可以用线性筛求。
那么有

∑ i = 1 n ∑ j = 1 m ∑ d ∣ gcd ⁡ ( i , j ) f ( d ) \sum_{i = 1}^n\sum_{j = 1}^m\sum_{d|\gcd(i, j)}f(d) i=1nj=1mdgcd(i,j)f(d)

这样的话我们就可以把 d d d 提前,首先枚举 d d d,得到:

∑ d = 1 n f ( d ) ∑ i = 1 n [ d ∣ i ] ∑ j = 1 m [ d ∣ j ] \sum_{d = 1}^nf(d)\sum_{i = 1}^n[d|i]\sum_{j = 1}^m[d|j] d=1nf(d)i=1n[di]j=1m[dj]

= ∑ d = 1 n f ( d ) ⌊ n d ⌋ ⌊ m d ⌋ = \sum_{d = 1}^nf(d)\lfloor\frac nd\rfloor\lfloor \frac md\rfloor =d=1nf(d)dndm

线性筛处理后就可以利用数论分块 O ( n ) O(\sqrt n) O(n ) 内求出这个和式了。

事实上,这里 f ( n ) = φ ( n ) f(n) = \varphi(n) f(n)=φ(n),这并不难判断,对于积性函数,只要证明这两个函数在 n = p k n = p^k n=pk 时相等就可以了,其中 p p p 是质数。

另一个反演法

有时候,我们会考虑枚举最大公约数,而枚举最大公约数是不好处理的,因为你无法很快地找到所有满足 gcd ⁡ ( i , j ) = k \gcd(i, j) = k gcd(i,j)=k 的数对,但是,如果我们枚举的只是一般的约数,那么找这个数对就会变得非常简单,这个时候,我们不妨考虑如下的反演:

对于一个函数 f ( r ) f(r) f(r),我们有
f ( r ) = ∑ i = 1 ⌊ n r ⌋ f ( i r ) [ i = 1 ] f(r) = \sum_{i = 1}^{\lfloor\frac nr\rfloor}f(ir)[i = 1] f(r)=i=1rnf(ir)[i=1]

我们沿用之前的套路对这个和式进行处理,希望能够找到一个反演公式。

f ( r ) = ∑ i = 1 ⌊ n r ⌋ f ( i r ) ∑ d ∣ i μ ( d ) f(r) = \sum_{i = 1}^{\lfloor\frac nr\rfloor}f(ir)\sum_{d|i}\mu(d) f(r)=i=1rnf(ir)diμ(d)

同样进行交换求和变量得到:

f ( r ) = ∑ d = 1 ⌊ n r ⌋ μ ( d ) ∑ i = 1 ⌊ n r ⌋ [ d ∣ i ] f ( i r ) f(r) = \sum_{d = 1}^{\lfloor\frac nr\rfloor}\mu(d)\sum_{i = 1}^{\lfloor\frac nr\rfloor}[d|i]f(ir) f(r)=d=1rnμ(d)i=1rn[di]f(ir)

我们用 i d id id 去替换以前的 i i i,得到:

= ∑ d = 1 ⌊ n r ⌋ μ ( d ) ∑ i = 1 ⌊ n r d ⌋ f ( i r d ) = \sum_{d = 1}^{\lfloor\frac nr\rfloor}\mu(d)\sum_{i = 1}^{\lfloor\frac n{rd}\rfloor}f(ird) =d=1rnμ(d)i=1rdnf(ird)

看到这里,我们知道我们的目的达成了,我们设:

g ( r ) = ∑ i = 1 ⌊ n r ⌋ f ( i r ) g(r) = \sum_{i = 1}^{\lfloor\frac nr\rfloor}f(ir) g(r)=i=1rnf(ir)

那么一定有:

f ( r ) = ∑ i = 1 ⌊ n r ⌋ μ ( i ) g ( i r ) f(r) = \sum_{i = 1}^{\lfloor\frac nr\rfloor}\mu(i)g(ir) f(r)=i=1rnμ(i)g(ir)

我们就得到了另一个反演公式,这个公式在很多时候是非常有用的,我们如果把 f ( r ) f(r) f(r) 当成对于所有最大公约数为 r r r 的数对的函数,那么 g ( r ) g(r) g(r) 就代表对于所有公约数为 r r r 的数对的函数(显而易见,即最大公约数为 r r r 的倍数),很多时候, f ( r ) f(r) f(r) 并不是那么好求,但是 g ( r ) g(r) g(r) 很好求,这样我们就可以通过求出 g ( r ) g(r) g(r),然后用这个反演公式来得到 f ( r ) f(r) f(r)

很多时候,这个反演公式比上面那个反演公式更为直观好用。

另一个反演法的应用

我们可以用这个反演法去解一下上边那个和式,来体会一下这两个反演法的区别。

∑ i = 1 n ∑ j = 1 m gcd ⁡ ( i , j ) \sum_{i = 1}^n\sum_{j = 1}^m\gcd(i, j) i=1nj=1mgcd(i,j)

我们不妨直接枚举最大公约数,假设当前最大公约数为 r r r,那么上式可以转化为:

∑ r = 1 n r ∑ i = 1 n ∑ j = 1 m [ gcd ⁡ ( i , j ) = r ] \sum_{r = 1}^nr\sum_{i = 1}^n\sum_{j = 1}^m[\gcd(i, j) = r] r=1nri=1nj=1m[gcd(i,j)=r]

我们设

f ( r ) = ∑ i = 1 n ∑ j = 1 m [ gcd ⁡ ( i , j ) = r ] f(r) = \sum_{i = 1}^n\sum_{j = 1}^m[\gcd(i, j) = r] f(r)=i=1nj=1m[gcd(i,j)=r]

这个函数并不是很好求,但是我们可以设:

g ( r ) = ∑ i = 1 ⌊ n r ⌋ f ( i r ) g(r) = \sum_{i = 1}^{\lfloor\frac nr \rfloor}f(ir) g(r)=i=1rnf(ir)

我们考虑 f ( r ) f(r) f(r) g ( r ) g(r) g(r) 的实际意义:

f ( r ) f(r) f(r) 代表所有满足 1 ≤ i ≤ n , 1 ≤ j ≤ m 1 \leq i \leq n, 1 \leq j \leq m 1in,1jm 的数对 ( i , j ) (i, j) (i,j) 中最大公约数为 r r r 的数量。
那么 g ( r ) g(r) g(r) 就是代表所有满足 1 ≤ i ≤ n , 1 ≤ j ≤ m 1 \leq i \leq n, 1 \leq j \leq m 1in,1jm 的数对 ( i , j ) (i, j) (i,j) 中公约数为 r r r 的数量。

公约数为 r r r 的数对个数非常好求,只要是满足 r ∣ i r | i ri r ∣ j r|j rj 就可以,满足 r ∣ i r|i ri i i i ⌊ n r ⌋ \lfloor\frac nr\rfloor rn 个,满足 r ∣ j r|j rj j j j ⌊ m r ⌋ \lfloor\frac mr\rfloor rm,所以 g ( r ) = ⌊ n r ⌋ ⌊ m r ⌋ g(r) = \lfloor\frac nr\rfloor\lfloor\frac mr\rfloor g(r)=rnrm,我们借此可以求出:

f ( r ) = ∑ i = 1 ⌊ n r ⌋ μ ( i ) ⌊ n r ⌋ ⌊ m r ⌋ f(r) = \sum_{i = 1}^{\lfloor \frac nr\rfloor}\mu(i)\lfloor\frac nr\rfloor\lfloor\frac mr\rfloor f(r)=i=1rnμ(i)rnrm

直接将 f ( r ) f(r) f(r) 代入最开始的式子,得到:

∑ r = 1 n r ∑ i = 1 ⌊ n r ⌋ μ ( i ) ⌊ n r ⌋ ⌊ m r ⌋ \sum_{r = 1}^nr\sum_{i = 1}^{\lfloor \frac nr\rfloor}\mu(i)\lfloor\frac nr\rfloor\lfloor\frac mr\rfloor r=1nri=1rnμ(i)rnrm

= ∑ r = 1 n r ⌊ n r ⌋ ⌊ m r ⌋ ∑ i = 1 ⌊ n r ⌋ μ ( i ) = \sum_{r = 1}^nr\lfloor\frac nr\rfloor\lfloor\frac mr\rfloor\sum_{i = 1}^{\lfloor \frac nr\rfloor}\mu(i) =r=1nrrnrmi=1rnμ(i)

处理一下 μ ( i ) \mu(i) μ(i) 的前缀和后依然可以进行 O ( n ) O(\sqrt n) O(n ) 的数论分块。

后记

两种反演法有着不同的效果,但是通常情况下,第二种可能会更好用一点,因为这种反演法允许你无脑枚举 gcd ⁡ \gcd gcd,然后通过这种反演法转化为枚举一般因数,不过对于具体的题目还是要具体分析。

你可能感兴趣的:(数论,acm,算法)