[容斥原理與莫比烏斯反演][學習筆記]


容斥原理 與 莫比烏斯反演

今天(2.23.2017)翻了一下《組合數學》前6章,發現我之前一定是學了假的莫比烏斯反演,於是來新寫一篇



# 容斥原理

定理

集合\(S\)中不具有性質\(P_i:1\le i \le m\)的元素個數:
\(A_i\)為具有性質\(P_i\)的集合

\( |S| - \sum{|A_i|} + \sum{A_i \bigcap A_j} -\sum{A_i \bigcap A_j \bigcap A_k}+...+ (-1)^m\sum{A_1 \bigcap A_2 \bigcap ... \bigcap A_m} \)



項數:$ \binom{m}{0} + \binom{m}{1} + ... + \binom{m}{m} = 2^m$


\(Proof.\)
\(1.\) 沒有任何一條性質的元素貢獻為\(1\)
\(2.\)\(n\)條性質的元素,在\(n\)個集合\(A_i\)中出現,貢獻為\(\binom{n}{0} - \binom{n}{1} + \binom{n}{2} + ... + (-1)^n\binom{n}{n} = 0\)


關於第二條的證明:
根據二項式定理,\((1-1)^n =0 :\ n \neq 0\)
或者考慮前\(n-1\)個元素都可以選或不選,最后一個元素為了保證選的元素個數的奇偶性只有一種選擇,所以奇數個元素的子集數量和偶數個元素的子集數量相等

實質

\[\sum\limits_{i=0}^{n}(-1)^i\binom{n}{i} = [n=0] \]

也就是上面的證明過程



錯排

滿足\(i_j \neq j\)的排列數

\[D_n = n!\sum\limits_{i=0}^{n}\frac{(-1)^i}{i!} \]

\(\binom{n}{i}(n-i)! \ =\ \frac{n!}{i!}\) 就是\(\ge i\)個位置不是錯排的方案數,應用容斥原理即可

還有一個遞推關系
\(D_n = nD_{n-1} + (-1)^n\)


總結

在統計一類問題時,應用容斥原理可以有效的弱化限制條件
有一種統計恰好k個的問題,限制很強,通常弱化為先拿出k個,剩下的任意
這時候容斥的形式通常是

\[=\ \ge k個\ -\ \ge k+1個\ +\ \ge k+2個\ ... \]

這時候我們在統計\(\ge j:k \le j \le n\)時,如果依靠了枚舉哪j個或者類似的DP,可能會過多的統計,比如一個\(k+i\)個的方案在這時候會被考慮\(\binom{k+i}{k}\)次,所以需要乘上一個組合數系數\(\binom{k+i}{k}\)

有的問題是恰好沒有之類的,這時候\(\binom{i}{0}=1\)所以不用考慮這個東西;同理,恰好n個也不用考慮。

update 2017.5.3:貌似這個東西也不是這么回事兒...感覺還與二項式反演有關...還是具體問題具體分析吧


**update 2017.5.15**

今天閑來無事證明了一下,這玩意應該是普遍成立的!

我們考慮一個恰好\(x:x \ge k\)個的方案被統計的次數:

\[\begin{align} &= \sum_{i=k}^x (-1)^{i-k}\binom{i}{k} \binom{x}{i} \\ &= \binom{x}{k} \sum_{i=k}^x (-1)^{i-k} \binom{x-k}{x-i}\\ &= \binom{x}{k} \sum_{j=0}^{x-k} \binom{x-k}{j} \\ &= [x==k] \end{align} \]

哈哈O(∩_∩)O


莫比烏斯反演 Mobius Inversion

說明

容斥原理是莫比烏斯反演在有限偏序集上的一個實例
莫比烏斯反演應用在一類二變量函數,偏序關系到實數的映射
《組合數學》上討論了好多任意有限偏序集的莫比烏斯反演,還有偏序集的直積,我已經看蒙了
所以直接說莫比烏斯反演在數論上的經典形式吧,反正不是整除關系也不會考



積性函數

定義

定義域為正整數集的函稱為數論函數

滿足\(f(ab) = f(a)f(b)\ : \ gcd(a,b) =1\)的數論函數稱為積性函數

完全積性函數對ab沒有互質限制


積性函數:\(\varphi(n),\ \mu(n)\)

完全積性函數:

  • 單位函數\(\epsilon(n)=[n=1]\),

  • 恆等函數\(id(n)=n\)

  • 常函數\(1(n)=1\)


狄利克雷卷積

\[(f*g)(n) = \sum\limits_{d|n}f(d)g(\frac{n}{d}) \]

滿足交換律結合律對加法的分配律,單位元 \(\epsilon\)


###性質 1. 積性函數的**點積**和**狄利克雷卷積**也是積性函數 2. 一個函數的約數和可以卷上$1$,如約數個數$d(n)=(1*1)(n)$,約數和 $\sigma(n) = (1*id)(n)$

計算

  1. 可以\(O(nlogn)\)預處理,無腦枚舉所有數的倍數
  2. 線性篩
  • i=1, i是質數和i%p[j]!=0的情況很好求
  • 對於i%p[j] == 0,可以通過分析增加一個最小質因子后的變化,或者直接考慮\(f(p^k)\)怎么求,反正積性函數不同質因子都是互質乘起來就行了不影響
  • 也可以篩出最小質因子的次數,分解成\(f(n) = f(p^k) f(\frac{n}{p^k})\),對於\(f(p^k)\)考慮如何計算,帶有約數和的可以考慮展開
  • 一些非積性函數也可以通過分析函數的性質也可以用線性篩來求
    例:歐拉函數可以直接根據公式得到如何處理 \(\varphi(n) = n\prod\frac{p_i-1}{p_i} = \prod{(p_i-1)*p_i^{e_i-1}}\)
void sieve() {
	varphi[1] = 1;
	for(int i=2; i<=n; i++) {
		if(!notp[i]) p[++p[0]] = i, varphi[i] = i-1;
		for(int j=1; j<=p[0] && i*p[j]<=n; j++) {
			notp[i*p[j]] = 1;
			if(i%p[j] == 0) {
				varphi[i*p[j]] = varphi[i] * p[j];
				break;
			}
			varphi[i*p[j]] = varphi[i] * (p[j]-1);
		}
	}
	for(int i=1; i<=n; i++) varphi[i] += varphi[i-1];
}



##莫比烏斯函數 $$ \mu(1) = 1\\ \mu(n) = (-1)^i \quad n 是i個質數之積 \\ \mu(n) = 0 \quad p^2 | n,\ p > 1 $$

\[ \mu * 1 = \epsilon,\ 即\ \sum\limits_{d|n}\mu(d) = [n=1]$$。 </br> $Proof.\ $設$n$有$k$種質因子, \]

\sum\limits_{d|n}\mu(d) = \sum_{i=0}^{k}(-1)^i\binom{k}{i}

\[和上面的容斥原理證明類似,應用二項式定理 </br> ## 歐拉函數 \]

\varphi(n) = \sum_{i=1}^n [(n,i)=1] \
\varphi(n) = \prod p^{c-1}(p-1)

\[ </br> 1. $$ \varphi * 1 = id \ 即 \ n = \sum\limits_{d|n}\varphi(d) ,\ 反演后\ \mu * id = \varphi \]

\(Proof.\) 考慮列出所有分子\(\frac{i}{n}\)一共\(n\)

  1. \[\sum_{i=1}^n [(n,i)=1]*i = \frac{[n=1] + n*\varphi(n)}{2} \]

    \(Proof.\) \((n,i)=(n, n-i)\),除了1和2 互質成對出現,和為n


莫比烏斯反演

\[g(n) = \sum_{d|n}f(d) \\ f(n) = \sum_{d|n}\mu(d)g(\frac{n}{d}) \]

\(g = f*1 \rightarrow f = g * \mu\)


\(Proof.\)
兩邊都卷上\(\mu * 1\)
其他證明方法還有很多,我寫這個是因為這個短


另一種形式

\[g(n) = \sum_{n|d}f(n) \\ f(n) = \sum_{n|d}\mu(d)g(\frac{d}{n}) \]


***

應用

感覺還是直接使用這個式子代換比較簡單,構造函數再進行反演好像並不好想

\[\sum\limits_{d|n}\mu(d) = [n=1] \]

有一些常見技巧:

  • 枚舉gcd取值
  • 交換枚舉倍數與約數
  • 用莫比烏斯函數求和替換
  • 改寫求和指標
  • 最后通常需要得到一個可以整除分塊的形式,處理一個函數的前綴和后可以在根號復雜度內解決一次詢問

一般的題目推導起來挺套路的,通常都是枚舉兩個變量求一個帶着gcd的東西(有的題目需要你自己把式子變形把gcd放進去),套路推♂倒之后都變成了整除分塊,然后重點就在如何通過線性篩求函數了

栗子

\[\begin{align*} \sum\limits_{i=1}^n \sum_{j=1}^m gcd(i,j) &= \sum_{d=1}^n d \sum_{i=1}^n \sum_{j=1}^m [gcd(i,j)=d] \\ 先枚舉d再枚舉倍數,出現[=1]的形式 \\ &=\sum_{d=1}^n d \sum_{i=1}^{\frac{n}{d}} \sum_{j=1}^{\frac{m}{d}} [gcd(i,j)=1] \\ 用\sum\limits_{e|n}\mu(e) = [n=1]替換 ,先枚舉e再枚舉倍數\\ &=\sum_{d=1}^n d\sum_{e=1}^n \mu(e) \frac{n}{de} \frac{m}{de} \\ 改寫求和指標,令D = de \\ &= \sum_{D=1}^n \sum_{d|D} d\mu(\frac{D}{d}) \frac{n}{D} \frac{m}{D}\\ 發現最后就是 id * \mu = \varphi \\ &= \sum_{D=1}^n \varphi(D) \frac{n}{D} \frac{m}{D}\\ \end{align*} \]

代碼

int notp[N], p[N];ll varphi[N];
void sieve(int n) {
    varphi[1]  1;
    for(in i=2; i<=n; i++) {
        if(!notp[i]) p[++p[0]] = i, varphi[i] = i-1;
        for(int j=1; j<=p[0] && i*p[j]<=n; j++) {
            notp[i*p[j]] = 1;
            if(i%p[j] == 0) {varphi[i*p[j]] = varphi[i]*p[j]; break;}
            varphi[i*p[j]] = varphi[i]*(p[j]-1);
        }
    }
    for(int i=1; i<=n; i++) varphi[i] += varphi[i-1];
}
ll cal(int n, int m) {
    ll ans=0; int r;
    for(int i=1; i<=n; i=r+1) {
        r = min(n/(n/i), m/(m/i));
        ans += (varphi[r] - varphi[i-1]) * (n/i) * (m/i);
    }
    return ans;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM