在平时,我们经常会需要对带 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 d2∣x 时, μ ( 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=p1p2…pn,则 μ ( 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]=d∣x∑μ(d)
其中 [ p ] [p] [p] 表示当 p p p 为真时结果为 1 1 1,当 p p p 为假时结果为 0 0 0。
后边的 ∑ \sum ∑ 表示求和符号,即所有满足 d ∣ x d|x d∣x 的整数 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=p1r1p2r2…pkrk,我们发现,只有当 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=p1r1′p2r2′…pkrk′,其中对任意 1 ≤ i ≤ k 1 \leq i \leq k 1≤i≤k, 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=0∑kCki(−1)i=(1−1)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)=d∣n∑[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)=d∣n∑[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)=d∣n∑k∣dn∑μ(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)=k∣n∑μ(k)d∣kn∑f(d)
如果说,我们设
g ( n ) = ∑ d ∣ n f ( d ) g(n) = \sum_{d|n}f(d) g(n)=d∣n∑f(d)
可以得到:
f ( n ) = ∑ k ∣ n μ ( k ) g ( n k ) f(n) = \sum_{k|n}\mu(k)g(\frac nk) f(n)=k∣n∑μ(k)g(kn)
我们不习惯用 k k k 来枚举因数,改成用 d d d,就可以得到莫比乌斯反演的结论了,即:
设
g ( n ) = ∑ d ∣ n f ( d ) g(n) = \sum_{d|n}f(d) g(n)=d∣n∑f(d)
那么便有:
f ( n ) = ∑ d ∣ n μ ( d ) g ( n d ) f(n) = \sum_{d|n}\mu(d)g(\frac nd) f(n)=d∣n∑μ(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)=d∣n∑f(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)=d∣a∑f(d)g(da)k∣b∑f(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) =d∣a∑k∣b∑f(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) =dk∣ab∑f(dk)g(dkab)=h(ab)
我们称这样的函数 h h h 为函数 f f f 和函数 g g g 的狄利克雷卷积,记作 h = f ∗ g h = f * g h=f∗g,狄利克雷卷积支持交换律结合律,然而一般情况下,它最大的作用就是两个积性函数的卷积一定是一个积性函数,通常用来证明一个函数是否是积性函数。
说了这么多,莫比乌斯反演到底怎么处理带 gcd \gcd gcd 的和式呢?
gcd \gcd gcd 有一个非常良好的性质,那就是 d ∣ i d|i d∣i 且 d ∣ j d|j d∣j 是 d ∣ gcd ( i , j ) d|\gcd(i,j) d∣gcd(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=1∑nj=1∑mgcd(i,j)
我们可以找到一个函数 f ( n ) f(n) f(n) 满足
n = ∑ d ∣ n f ( d ) n = \sum_{d|n}f(d) n=d∣n∑f(d)
利用莫比乌斯反演,得到
f ( n ) = ∑ d ∣ n μ ( d ) n d f(n) = \sum_{d|n}\mu(d)\frac nd f(n)=d∣n∑μ(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=1∑nj=1∑md∣gcd(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=1∑nf(d)i=1∑n[d∣i]j=1∑m[d∣j]
= ∑ d = 1 n f ( d ) ⌊ n d ⌋ ⌊ m d ⌋ = \sum_{d = 1}^nf(d)\lfloor\frac nd\rfloor\lfloor \frac md\rfloor =d=1∑nf(d)⌊dn⌋⌊dm⌋
线性筛处理后就可以利用数论分块 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=1∑⌊rn⌋f(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=1∑⌊rn⌋f(ir)d∣i∑μ(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=1∑⌊rn⌋μ(d)i=1∑⌊rn⌋[d∣i]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=1∑⌊rn⌋μ(d)i=1∑⌊rdn⌋f(ird)
看到这里,我们知道我们的目的达成了,我们设:
g ( r ) = ∑ i = 1 ⌊ n r ⌋ f ( i r ) g(r) = \sum_{i = 1}^{\lfloor\frac nr\rfloor}f(ir) g(r)=i=1∑⌊rn⌋f(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=1∑⌊rn⌋μ(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=1∑nj=1∑mgcd(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=1∑nri=1∑nj=1∑m[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=1∑nj=1∑m[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=1∑⌊rn⌋f(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 1≤i≤n,1≤j≤m 的数对 ( 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 1≤i≤n,1≤j≤m 的数对 ( i , j ) (i, j) (i,j) 中公约数为 r r r 的数量。
公约数为 r r r 的数对个数非常好求,只要是满足 r ∣ i r | i r∣i 且 r ∣ j r|j r∣j 就可以,满足 r ∣ i r|i r∣i 的 i i i 有 ⌊ n r ⌋ \lfloor\frac nr\rfloor ⌊rn⌋ 个,满足 r ∣ j r|j r∣j 的 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)=⌊rn⌋⌊rm⌋,我们借此可以求出:
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=1∑⌊rn⌋μ(i)⌊rn⌋⌊rm⌋
直接将 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=1∑nri=1∑⌊rn⌋μ(i)⌊rn⌋⌊rm⌋
= ∑ 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=1∑nr⌊rn⌋⌊rm⌋i=1∑⌊rn⌋μ(i)
处理一下 μ ( i ) \mu(i) μ(i) 的前缀和后依然可以进行 O ( n ) O(\sqrt n) O(n) 的数论分块。
两种反演法有着不同的效果,但是通常情况下,第二种可能会更好用一点,因为这种反演法允许你无脑枚举 gcd \gcd gcd,然后通过这种反演法转化为枚举一般因数,不过对于具体的题目还是要具体分析。