数论千万条,反演第一条。反演不会做,队友两行泪。
一、什么是莫比乌斯反演?
- g ( n ) = ∑ d ∣ n f ( d ) ⟺ f ( n ) = ∑ d ∣ n μ ( d ) g ( n d ) . . . . . . . . . . . . . ( 1 ) {g(n) = \displaystyle\sum_{d|n}f(d)\Longleftrightarrow f(n) = \displaystyle\sum_{d|n}\mu(d)g(\frac{n}{d})}.............(1) g(n)=d∣n∑f(d)⟺f(n)=d∣n∑μ(d)g(dn).............(1)
- g ( n ) = ∑ n ∣ d f ( d ) ⟺ f ( n ) = ∑ n ∣ d μ ( d n ) g ( d ) . . . . . . . . . . . . . . ( 2 ) {g(n) = \displaystyle\sum_{n|d}f(d)\Longleftrightarrow f(n) = \displaystyle\sum_{n|d}\mu(\frac{d}{n})g(d)}..............(2) g(n)=n∣d∑f(d)⟺f(n)=n∣d∑μ(nd)g(d)..............(2)
很多时候函数 f f f很难求,但是函数 g g g可以比较容易的求出来,所有我们通过求出 g g g来求出 f f f,这个由 g g g求出 f f f的过程就是反演。
二、前置知识
1.莫比乌斯函数
μ ( n ) = { 1 , n = 1 ( − 1 ) k , n = P 1 P 2 . . . P k 0 , o t h e r \mu(n) =\begin{cases} 1,\ \ \ \ \ \ \ \ \ \ n=1\\ (-1)^k,\ \ n = P_1P_2...P_k\\0,\ \ \ \ \ \ \ \ \ \ other\end{cases} μ(n)=⎩⎪⎨⎪⎧1, n=1(−1)k, n=P1P2...Pk0, other
其中 P 1 P 2 . . . P k P_1P_2...P_k P1P2...Pk为质数。
莫比乌斯函数推导
线性筛求莫比乌斯函数:
int prime_tot = 0;
bool prime_tag[N];
int prime[N],mu[N];
void get_prime(){
mu[1] = 1;//n = 1时,莫比乌斯函数mu[1] = 1,
for(int i = 2; i < N; i++){
if(!prime_tag[i]) prime[prime_tot++] = i,mu[i] = -1;//如果i是一个质数,那么其莫比乌斯函数一定是-1
for(int j = 0; j < prime_tot && i * prime[j] < N; j++){
prime_tag[i * prime[j]] = true;
if(i % prime[j] == 0){
mu[i * prime[j]] = 0;//可以知道此处prime[j] | i,
//那么i * prime[j]里就有一个prime[j]的平方存在
break;
}else
mu[i * prime[j]] = -mu[i];//i * prime[j]为k个质数的乘积,如果k是奇数mu[i]就是-1,
//是偶数mu[i]为1
}
}
}
2.狄利克雷卷积
狄利克雷卷积是一个对函数的运算。
狄利克雷卷积:
对于两个函数 f , g f,g f,g,它们的狄利克雷卷积是
( f ∗ g ) ( n ) = ∑ d ∣ n f ( d ) g ( n d ) (f*g)(n) = \displaystyle\sum_{d|n}f(d)g(\frac{n}{d}) (f∗g)(n)=d∣n∑f(d)g(dn)
积性函数:
两个数 a , b a,b a,b互质,对于函数 f f f,如果 f ( a b ) = f ( a ) f ( b ) f(ab)=f(a)f(b) f(ab)=f(a)f(b),那么函数 f f f就是一个积性函数。
完全积性函数:
任意两个数 a , b a,b a,b,都有 f ( a b ) = f ( a ) f ( b ) f(ab)=f(a)f(b) f(ab)=f(a)f(b)。
常见的积性函数
- 欧拉函数 φ ( n ) \varphi(n) φ(n)
- 莫比乌斯函数 μ ( n ) \mu(n) μ(n)
- 单位函数 I d ( n ) = n Id(n) = n Id(n)=n
- 不变函数 1 ( n ) = 1 1(n) = 1 1(n)=1,不变的函数,所有值都是 1 1 1
- 幂函数 i d k ( k ) = n k idk(k) = n^k idk(k)=nk
- 因子个数函数 d ( n ) , d = 1 ( n ) ∗ 1 ( n ) d(n),d = 1(n)*1(n) d(n),d=1(n)∗1(n),n的正因子数目
- 因子和函数 σ ( n ) , σ = 1 ( n ) ∗ I d , n \sigma(n),\sigma = 1(n)*Id,n σ(n),σ=1(n)∗Id,n的所有正因子之和
- 因子函数 σ k ( n ) σk(n) σk(n),n的所有正因子的k次幂之和
- 狄利克雷卷积单位元 ε = [ n = = 1 ] \varepsilon = [n==1] ε=[n==1]
- 逆元:对于每一个 f ( 1 ) = 0̸ f(1)=\not0 f(1)=0的函数 f f f,都有 f ∗ g = ε f∗g=\varepsilon f∗g=ε
如何求一个函数的逆元:
首先我们定义两个函数 f , g f,g f,g:
g ( n ) = 1 f ( 1 ) ( [ n = = 1 ] − ∑ i ∣ n , i ≠ 1 f ( i ) g ( n i ) ) g(n)=\frac{1}{f(1)}\left([n==1]-\sum_{i|n,i\neq 1}f(i)g(\frac{n}{i})\right) g(n)=f(1)1⎝⎛[n==1]−i∣n,i=1∑f(i)g(in)⎠⎞
这样的话,他们的狄利克雷卷积 f ∗ g f*g f∗g 就是:
∑ i ∣ n f ( i ) g ( n i ) = f ( 1 ) g ( n ) + ∑ i ∣ n , i ≠ 1 f ( i ) g ( n i ) = f ( 1 ) ∗ 1 f ( 1 ) ( [ n = = 1 ] − ∑ i ∣ n , i ≠ 1 f ( i ) g ( n i ) ) + ∑ i ∣ n , i ≠ 1 f ( i ) g ( n i ) = [ n = = 1 ] \sum_{i|n}f(i)g(\frac{n}{i})\\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =f(1)g(n)+\sum_{i|n,i\neq1}f(i)g(\frac{n}{i})\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =f(1)*\frac{1}{f(1)}\left([n==1]-\sum_{i|n,i\neq 1}f(i)g(\frac{n}{i})\right)+ \sum_{i|n,i\neq1}f(i)g(\frac{n}{i})\\=[n==1] i∣n∑f(i)g(in) =f(1)g(n)+i∣n,i=1∑f(i)g(in) =f(1)∗f(1)1⎝⎛[n==1]−i∣n,i=1∑f(i)g(in)⎠⎞+i∣n,i=1∑f(i)g(in)=[n==1]
此处证明推导均来自:铃悬dalao的博客
一些关于莫比乌斯函数和狄利克雷卷积单位元的性质
1.不变常数 1 1 1 和莫比乌斯函数 μ \mu μ 互为逆元。
用上述求逆元的方法直接套,令 g ( n ) = 1 ( n ) , f ( n ) = μ ( n ) g(n) = 1(n),f(n) = \mu(n) g(n)=1(n),f(n)=μ(n)。
2.两个积性函数的狄利克雷卷积是积性函数。
3.积性函数的逆是积性函数。
2和3具体详细的证明还是参考铃悬dalao的博客https://www.luogu.org/blog/lx-2003/mobius-inversion
3.整除分块
看一个题目:求 ∑ k = 1 n ⌊ n k ⌋ \displaystyle\sum^{n}_{k= 1}\lfloor\frac{n}{k}\rfloor k=1∑n⌊kn⌋的值。
可能会想到暴力,直接遍历一遍,但当 n n n很大的时候,时间是使dalao们不满意的。
所以有了整除分块的想法。
拿 n = 25 n = 25 n=25 来举例:
首先可以发现, ⌊ n k ⌋ \lfloor \frac{\ n\ }{\ k\ }\rfloor ⌊ k n ⌋ 只有 2 n 2\sqrt{n} 2n种,那我们按照 ⌊ n k ⌋ \lfloor \frac{\ n\ }{\ k\ }\rfloor ⌊ k n ⌋ 的结果分类的:
int ans = 0;
for(int l = 1 , r; l <= n; l = r + 1){
r = n / (n / l);
ans += (r - l + 1)(n / l);
}
这样一来,整除通过这种分块的思想就把时间复杂度降到了 O ( 2 n ) O(2\sqrt{n}) O(2n)。
三、莫比乌斯反演的证明
- g ( n ) = ∑ d ∣ n f ( d ) ⟺ f ( n ) = ∑ d ∣ n μ ( d ) g ( n d ) . . . . . . . . . . . . . ( 1 ) {g(n) = \displaystyle\sum_{d|n}f(d)\Longleftrightarrow f(n) = \displaystyle\sum_{d|n}\mu(d)g(\frac{n}{d})}.............(1) g(n)=d∣n∑f(d)⟺f(n)=d∣n∑μ(d)g(dn).............(1)
- g ( n ) = ∑ n ∣ d f ( d ) ⟺ f ( n ) = ∑ n ∣ d μ ( d n ) g ( d ) . . . . . . . . . . . . . . ( 2 ) {g(n) = \displaystyle\sum_{n|d}f(d)\Longleftrightarrow f(n) = \displaystyle\sum_{n|d}\mu(\frac{d}{n})g(d)}..............(2) g(n)=n∣d∑f(d)⟺f(n)=n∣d∑μ(nd)g(d)..............(2)
首先证明 ( 1 ) (1) (1),这很好证明( 1 1 1代表不变函数):
g = f ∗ 1 , f = μ ∗ g = μ ∗ 1 ∗ f = f g = f*1,f = \mu*g=\mu *1*f=f g=f∗1,f=μ∗g=μ∗1∗f=f
然后证明 ( 2 ) (2) (2):
令 k = d n k = \frac{d}{n} k=nd,则:
∑ n ∣ d μ ( d n ) g ( d ) = ∑ k μ ( k ) g ( n k ) = ∑ k μ ( k ) ∑ ( n k ) ∣ t f ( t ) \sum_{n|d}\mu(\frac{d}{n})g(d)=\sum_{k}\mu(k)g(nk)=\sum_{k}\mu(k)\sum_{(nk)|t}f(t) n∣d∑