Preface
前排提示:本文數學公式較多,加載\(\LaTeX\)需要一定時間,可能會導致瀏覽器暫時卡頓,請耐心等待數學公式正常顯示.
組合數學知識點的總結,本來准備寫在一起的,結果發現字數有點多,導致\(\mathrm{markdown}\)編輯器頻繁卡頓,那就分三篇發布好了.
\(\mathrm{Update}\):目前第一篇就是組合基礎和組合原理,預計第二篇基礎高數,生成函數和特殊計數數列,第三篇多項式算法,至於會不會咕咕咕那就不知道了.
基本組合數學
一些定義和符號
\(1.\) 用\(n!\)表示\(n\)的階乘,\(n!=1\times 2\times \cdots \times n\),用\(n^{\underline k}\)表示下降階乘冪,簡稱下降冪,\(n^{\underline k}=n\times (n-1)\times \cdots \times (n-k+1)\),用\(n^{\overline k}\)表示上升階乘冪,簡稱上升冪,\(n^{\overline k}=n\times (n+1)\times \cdots\times (n+k-1)\).
\(2.\) 用\(\mathrm{A}_n^m\)表示從\(n\)個元素種選出\(m\)個組成的排列數量,稱為排列數,\(\mathrm{A}_n^m=\frac{n!}{(n-m)!}\).
\(3.\) 用\(\mathrm{C}_n^m\)或\({n \choose m}\)表示從\(n\)個元素種選出\(m\)個組成的子集數量,稱為組合數,\(\mathrm{C}_n^m={n\choose m}=\frac{n!}{m!(n-m)!}\).
\(4.\) 下降階乘冪\(n^{\underline k}\)種\(n\)可以是任意實數,當我們將組合數\({r\choose k}\)定義改為\({r\choose k}=\frac{r^{\underline k}}{k!}\)時,稱其為二項式系數,其中上指標可以為任意實數,下指標仍為整數,當下指標\(k<0\)時,二項式系數的值為\(0\).
計數原理和計數方法
計數原理
\(1.\) 加法原理:如果完成一件事情有\(n\)類方法,且第\(i\)類方法有\(a_i\)種方案,則完成這件事情共有\(\sum a_i\)種方案。
\(2.\) 乘法原理:如果完成一件事情有\(n\)個步驟,且第\(i\)個步驟有\(a_i\)種方案,則完成這件事情共有\(\prod a_i\)種方案。
計數方法
\(1.\) 相鄰元素捆綁法
例:現有\(7\)人站成一排,其中甲乙相鄰且丙丁相鄰,共有多少種不同的排法?
將甲乙兩元素捆綁成整體並看成一個復合元素,同時丙丁也看成一個復合元素,再與其它元素進行排列. 因此方案數為\(\mathrm{A}_5^5\times \mathrm{A}_2^2\times \mathrm{A}_2^2=480\)種.
\(2.\) 不相鄰元素插空法
例:現有\(4\)個\(A\)球,\(2\)個\(B\)球,\(3\)個\(C\)球,把它們排成一排,所有\(A\)球不能相鄰,且所有的球都是可分辨的,求有多少種排法?
先把\(B,C\)球排好,此時出現了\(6\)個間隙,把\(A\)球插入這些間隙即可. 因此方案數為\(\mathrm{A}_5^5\times \mathrm{A}_6^4=43200\)種.
\(3.\) 相同元素隔板法
例:把\(10\)個完全相同的球放入\(7\)個盒子中,每個盒子至少放一個,求有多少種方案?
因為球是相同的,所以可以將球先隨意地排成一行,此時球與球之間出現了\(9\)個間隙,插入\(6\)個板就可以做到把球分割為\(7\)個非空部分的效果. 因此方案數為\({9 \choose 6}=84\)種.
重要的組合恆等式
對稱恆等式
對於\(n,k\in \Z,n\geq 0\)成立.
證明:根據定義階乘展開即可.
吸收/提取恆等式
對於\(r\in \R,k\in \Z\)且\(k\not = 0\)成立.
證明:$$\binom{r}{k}=\frac{r^{\underline{k}}}{k!}=\frac{r}{k}\times \frac{(r-1)^{\underline{k-1}}}{(k-1)!}=\frac{r}{k}\binom{r-1}{k-1}$$
加法/歸納恆等式
對於\(r\in \R,k \in \Z\)成立.
證明:
相伴恆等式
對於\(r\in \R,k\in \Z\)成立.
證明:
上指標反轉
對於\(r\in \R,k \in \Z\)成立.
證明:
三項式系數恆等式
對於\(r\in \R, m,k\in \Z\)成立.
證明:
上指標求和
對於\(n,m\in \Z\)成立.
證明:
設有\(n+1\)個物品,標號為\(1\sim n+1\),現在從中選取\(m+1\)個物品的方案數即為\({n+1\choose m+1}\),同時等價於在\(n\)個物品每個物品后插入一個結束符,強選結束符並在結束符前選\(m\)個物品的方案數。
平行恆等式
對於\(n,m\in \Z\)成立。
證明:
范德蒙德卷積/下指標卷積
對於\(r,s\in \R , n\in \Z\)成立。
證明:
左邊表示從\(r\)個男生中選\(k\)個人,從\(s\)個女生中選出\(n-k\)個人的方案數,求和即為在\(r+s\)個人中選\(n\)個人的方案數,可知:\(\sum_{k=0}^n\binom{r}{k}\binom{s}{n-k}=\binom{r+s}{n}\)。
下指標點積
假設\(m<n\),則對於\(n,m\in \Z\)成立.
證明:
上指標卷積
對於\(n,a,b\in \Z\)成立.
證明:考慮左式的組合意義為將\(n\)個物品分為在左右兩部分,左邊選\(a\)個,右邊選\(b\)個的方案數,同時等價於插入一個分隔符,共\(n+1\)個物品選\(a+b+1\)個的方案數.
- 上指標求和和上指標卷積同樣存在非組合意義的直接證明方式,而范德蒙德卷積存在生成函數的證明方式,這保證了它們的絕對正確性.
二項式定理相關
二項式定理
根據二項式定理,組合數可以作為二項式高次冪展開式的系數:
該式被稱作二項式定理.
證明:
根據數學歸納法,該式在\(n=1\)時顯然成立,那么假設其在\(n=p-1(p\geq 2)\)時也成立,則有:
可知對於\(n=p\),該式也成立,故對於所有\(n\in \N^+\),定理都成立.
二項式定理的推廣
由於二項式系數的上指標可以是任意實數,所以二項式定理也有推廣形式:
其中\(\alpha \in \R\),稱為廣義二項式定理.
- 事實上,我們還需考慮右式的收斂性,不過在應用中完全不需要理會這點.
對於階乘冪,二項式定理仍成立:
證明略.
二項式定理的直接推論
\(1. \sum_{i=0}^n {n\choose i}=(1+1)^n=2^n\)
\(2. \sum_{i=0}^n{n\choose i}[2|i]=\sum_{i=1}^n{n\choose i}[2\not | i]=2^{n-1}\)
證明:
首先\(n\)個數中選奇數個數和選偶數的數的方案肯定是一樣的.那么考慮選偶數個數的方案:單獨考慮最后一個數,若選,則還需在\(n-1\)個數中選奇數個數,若不選,則還需選偶數個數,問題轉回到推論一,答案即為\(2^{n-1}\).
\(3. \sum_{i=0}^n(-1)^i{n\choose i}=(1-1)^n=[n=0]\)
多項式定理
定義多項式系數$$\binom{n_1+n_2+\cdots+n_k}{n_1,n_2,\cdots,n_k}=\frac{(n_1+n_2+\cdots+n_k)!}{n_1!n_2!\cdots n_k!}$$
則有如下的多項式定理成立:
證明可以直接從組合角度考慮.
模域組合數的計算
預處理楊輝三角的方法
楊輝三角是二項式系數在三角形中的一種幾何排列,由中國數學家楊輝提出. 形式化地,楊輝三角可以表示成如下的下三角矩陣:
其中\(A_{i,j}\)表示楊輝三角的第\(i\)行第\(j\)個數,有\(A_{i,j}={i\choose j}\). 楊輝三角滿足\(A_{i,j}=A_{i-1,j}+A_{i-1,j-1}\),本質上是組合數的加法恆等式.
那么我們可以根據加法恆等式預處理一張\(n^2\)大小的楊輝三角形的表,\(O(1)\)回答組合數。
對模數沒有任何要求,時間復雜度\(O(n^2)-O(1)\).
#include <bits/stdc++.h>
using namespace std;
const int N = 5020;
int C[N][N],n,Mod;
inline int inc(int a,int b) { return a + b >= Mod ? a + b - Mod : a + b; }
inline void Init(void)
{
C[0][0] = C[1][0] = C[1][1] = 1;
for (int i = 2; i <= n; i++)
{
C[i][0] = C[i][i] = 1;
for (int j = 1; j < i; j++)
C[i][j] = inc( C[i-1][j] , C[i-1][j-1] );
}
}
預處理階乘的方法
計算模意義下的組合式最常用的方法就是根據組合數的階乘展開式計算。我們可以\(O(n)\)預處理階乘,並用費馬小定理求出最大數值階乘的逆元,倒序更新所有階乘的逆元,就可以實現\(O(1)\)回答組合數.
此時要求模數\(p\)為大於\(n,m\)的質數,換言之,\(1\sim \max(n,m)\)的階乘在模\(p\)意義下均存在逆元時,該方法有效,時間復雜度\(O(n)-O(1)\).
#include <bits/stdc++.h>
using namespace std;
const int Mod = 1e9 + 7 , N = 1e6 + 20;
inline int inc(int a,int b) { return a + b >= Mod ? a + b - Mod : a + b; }
inline int dec(int a,int b) { return a - b < 0 ? a - b + Mod : a - b; }
inline int mul(int a,int b) { return 1LL * a * b % Mod; }
inline void Inc(int &a,int b) { return void( a = inc( a , b ) ); }
inline void Dec(int &a,int b) { return void( a = dec( a , b ) ); }
inline void Mul(int &a,int b) { return void( a = mul( a , b ) ); }
inline int fastpow(int a,int b) { int res = 1; for (; b; Mul(a,a),b>>=1) if (b) Mul(res,a); return res; }
inline int Inv(int x) { return fastpow( x , Mod - 2 ); }
int inv[N],fac[N];
inline void Init(void)
{
inv[0] = fac[0] = 1;
for (int i = 1; i <= N - 20; i++) fac[i] = mul( fac[i-1] , i );
inv[ N - 20 ] = Inv( fac[ N - 20 ] );
for (int i = N - 21; i >= 1; i--) inv[i] = mul( inv[i+1] , i+1 );
}
inline int C(int n,int m) { return ( m > n || n < 0 || m < 0 ) ? 0 : mul( fac[n] , mul( inv[m] , inv[n-m] ) ); }
Lucas定理
當模數\(p\leq\max(m,n-m)\)時,組合數分母的\(m!(n-m)!\)就不存在逆元,此時我們需要用到\(\mathrm{Lucas}\)定理:
證明:
引理:\((1+x)^p\equiv1+x^p\pmod p,p\in \mathrm{Prime}\).
有費馬小定理可知\((1+x)^p\equiv1+x\),又因為\(x\equiv x^p\),可知\((1+x)^p\equiv 1+x^p\).
用二項式定理展開上式中的三個二項式的冪:
左式取到\(x^m\)項系數為\({n\choose m}\),右式取到\(x^m\)項系數當且僅當\(j=\left\lfloor\frac{m}{p}\right\rfloor,k=m\bmod p\),對應項系數同余,所以就有:
- 另一種理解,\(\mathrm{Lucas}\)定理的含義即為將組合數拆解為\(n,m\)按照\(p\)進制分解后每一位的組合數之積
回到上文,對於模數\(p\)較小時,只要\(p\)為質數,我們就可以運用\(\mathrm{Lucas}\)定理遞歸求解組合數,時間復雜度\(O(p)-O(\log_{p}n)\).
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 20;
int inv[N],fac[N],n,m,Mod,T;
inline int inc(int a,int b) { return a + b >= Mod ? a + b - Mod : a + b; }
inline int dec(int a,int b) { return a - b < 0 ? a - b + Mod : a - b; }
inline int mul(int a,int b) { return 1LL * a * b % Mod; }
inline void Inc(int &a,int b) { return void( a = inc( a , b ) ); }
inline void Dec(int &a,int b) { return void( a = dec( a , b ) ); }
inline void Mul(int &a,int b) { return void( a = mul( a , b ) ); }
inline int fastpow(int a,int b) { int res = 1; for (; b; Mul(a,a),b>>=1) if (b) Mul(res,a); return res; }
inline int Inv(int x) { return fastpow( x , Mod - 2 ); }
inline void Init(void)
{
inv[0] = fac[0] = 1;
for (int i = 1; i <= Mod - 1; i++) fac[i] = mul( fac[i-1] , i );
inv[Mod-1] = Inv( fac[Mod-1] );
for (int i = Mod - 2; i >= 1; i--) inv[i] = mul( inv[i+1] , i+1 );
}
inline int C(int n,int m) { return ( m > n || n < 0 || m < 0 ) ? 0 : mul( fac[n] , mul( inv[m] , inv[n-m] ) ); }
inline int Lucas(int n,int m) { return m == 0 ? 1 : mul( C(n%Mod,m%Mod) , Lucas(n/Mod,m/Mod) ); }
int main(void)
{
scanf( "%d" , &T );
while ( T --> 0 )
scanf( "%d%d%d" , &n , &m , &Mod ),
Init() , printf( "%d\n" , Lucas(n+m,n) );
return 0;
}
常見的組合問題
組合數的單調性
對於上指標確定的組合數,我們可以令\(f(x)={n\choose x}(n\in \N ^ +)\),則函數\(f\)是單峰函數,其極值在\(x=\lfloor \frac{n}{2} \rfloor\)處取到.
階乘冪反轉
兩類階乘冪可以提取因數\(-1\)進行互相轉換:
循環排列
從\(n\)個元素中選出\(m\)個排成圓圈的方案數,相當於線性排列時固定第一個數的方案。
一個循環排列可以對應\(m\)個線性排列,進而可以得到循環排列的計算公式:
組合數的數論性質
若\(p\)為質數,則對於\(n\in[1,p-1]\),有\(p\ |\ \binom{p}{n}\)。
證明:
不定方程的解數問題
\(1.\) 正整數解
求不定方程\(x_1+x_2+\cdots+x_k=n\)的正整數解的個數。
這個問題等價於把\(n\)個球放入\(k\)個盒子中,每個盒子中至少有\(1\)個球,由隔板法可知其方案數為\(\binom{n-1}{k-1}\)。
\(2.\) 非負整數解
求不定方程\(x_1+x_2+\cdots+x_k=n\)的非負整數解的個數。
我們可以新增\(k\)個球,這樣問題就等價於把\(n+k\)個球放入\(k\)個盒子中,每個盒子中至少有\(1\)個球,由隔板法可知其方案數為\(\binom{n+k-1}{k-1}\)。
\(3.\) 下界限制
求不定方程\(x_1+x_2+\cdots+x_k=n\)的整數解的個數,滿足\(x_1\geq a_1,x_2\geq a_2,\cdots,x_k\geq a_k\)。
這個問題等價於不定方程\(x_1+x_2+\cdots+x_k=n-a_1-a_2-\cdots-a_k\)的非負整數解個數,可以其方案數為$$\binom{n+k-1-\sum_{i=1}^{n}a_i}{k-1}$$
\(4.\) 上下界限制
求不定方程\(x_1+x_2+\cdots+x_k=n\)的整數解的個數,滿足\(a_1\leq x_1\leq b_1,a_1\leq x_2\leq b_2,\cdots,a_k\leq x_k\leq b_k\)。
首先把限制轉換為\(0\leq x_1\leq b_1-a_1,\cdots,0\leq x_k\leq b_k-a_k\),運用容斥原理,答案即為:
多重集排列數
多重集指含有重復元素的廣義集合。設多重集\(S=\{n_1\times a_1,n_2\times a_2,\cdots,n_k\times a_k\}\)是由\(n_1\)個\(a_1\),\(n_2\)個\(a_2\),\(...\),\(n_k\)個\(a_k\)組成的集合,則\(S\)的全排列個數為
證明:
對於朴素全排列,顯然有\(\left (\sum_{i=1}^k n\right )!\)種方案,而在多重集的排列過程中,每個\(a_i\)出現了\(n_i\)次,在這\(n_i\)個位置間各個\(a_i\)可以互相調換位置,有\(n_i!\)中方案,故除去每一個\(n_i\)可以調換位置的重復方案即為總排列數.
多重集的組合數
設多重集\(S=\{n_1\times a_1,n_2\times a_2,\cdots,n_k\times a_k\}\)是由\(n_1\)個\(a_1\),\(n_2\)個\(a_2\),\(...\),\(n_k\)個\(a_k\)組成的集合,從中取出\(r\left(r\leq\sum_{i=1}^{k}n_i\right)\)個元素可以組成不同集合個數為:
證明:
首先考慮\(r\leq\min\{n_i\}\)的情況,根據不定方程的非負整數解數量,可知答案為\({k+r-1\choose k-1}\).
然后可以考慮容斥原理,對於\(i\),讓選擇\(a_i\)個數超出\(n_i\)成為一個性質,那么不具備任何性質的方案數即為上式.
高階差分
定義離散函數的差分算子\((\Delta a)_i=a_i-a_{i-1}\),則有:
證明:
容易在算子間定義四則運算,此處不再贅述.
定義平移算子\((\mathrm{E}a)_i=a_{i-1}\),恆等算子\((\mathrm{I}a)_i=a_i\),那么就有\(\Delta =\mathrm{I-E}\).
根據二項式定理展開:
取第\(i\)項就可以得到:
可以用多項式卷積算法求高階差分序列的前\(n\)項.
下指標求和(HDU6333)
對於組合數的下指標求和,即:
沒有很好的封閉形式解,但是對於多組\((n,m)\)的詢問,我們可以將\(n,m\)看作一個區間的左右端點,使用\(O(\max\{n_i,m_i\}\sqrt q)\)的莫隊算法來求解.
考慮轉移,對於\(m\rightarrow m+1\),只需加上一個組合數\({n\choose m+1}\)即可. 對於\(n\rightarrow n+1\),我們可以考慮用加法公式進行拆解:
於是區間移動可以\(O(1)\)處理了.
自然數冪和
自然數冪和指的是這一類求和問題:
對於\(k\)比較小的情況,可以用組合恆等式推出通項公式.
- 不難發現,\(k\)次多項式的求和式都可以表示為\(k+1\)次多項式.
對於\(k\)任意的情況,我們很難直接推出通項公式,但是可以通過多項式插值技巧求出答案,我們會在下文討論這個問題.
組合原理
鴿巢原理
普通鴿巢原理
鴿巢原理又稱抽屜原理,形式化表述如下:
- 設\(q_1,q_2,q_3,\cdots,q_n\)是正整數,如果將\(\sum q_i-n+1\)個物品放入\(n\)個盒子中,記第\(i\)個盒子里放了\(a_i\)個物品,則總存在一個盒子\(j\),滿足\(a_j\geq q_j\).
證明:
反證法,若不存在這樣的盒子\(j\),則對於任意的\(i\)都有\(a_i<q_i\),那么\(\sum a_i\leq \sum(q_i-1)<\sum q_i -n+1\),與總球數為\(\sum q_i - n + 1\)矛盾.
應用\(1\):每十三個人中,總存在兩人出生在同一個月.
證明:顯然.
應用\(2\):對於序列\(a_{1\sim n}\),總存在區間\([l,r]\)使得\(n|\sum_{i=l}^ra_i\) .
證明:記其前綴和為數組\(s_{0\sim n}\),共有\(n+1\)個元素,所以必定存在\(i,j\)滿足\(s_i\equiv s_j\pmod n\),於是令\(l=i-1,r=j\)即可.
平均值原理
對於\(n\)個變量\(x_1,x_2,\cdots,x_n\),總滿足:
證明:反證法,導出矛盾.
Ramsey定理
對於正整數\(n,m\),總存在確定的上界\(x\),滿足對\(\mathrm{K}_x\)中所有邊隨意黑白染色,其中要么包含黑色\(\mathrm{K}_n\),要么包含白色\(\mathrm{K}_m\). 可以記\(x=\mathrm{R}(n,m)\),稱為\(\mathrm{Ramsey}\)數.
證明略.
實例:\(\mathrm{R}(3,3)=6\). 可以考慮第一個點的五條邊,根據鴿巢原理,總存在三條邊同色,那么三條同色邊連接的三個點要么構成同色\(\mathrm{K}_3\),要么與第一個點構成另一種同色\(\mathrm{K}_3\).
\(\mathrm{Ramsey}\)定理在高維情況下仍然成立,即:
反演原理
反演的實質
對於形如下的式子,我們稱左右兩式互為反演式:
我們可以把\(f,g\)看作只有一行的矩陣,於是反演原理本質上就是矩陣乘法求逆:
- 我們還可以發現\(A,B\)都是下三角矩陣.
不過矩陣乘法並沒有什么用,我們可以根據反演式倒推反演成立的充要條件. 方法其實很簡單,我們可以將右式的表達式帶入到左式里面,如果最后化簡得到了恆等式,那就說明右式可以推導得到左式.
同理,我們再把左式帶到右式里面,然后化簡得到恆等式,才能說明反演成立.
那么我們來實操一下:
於是就有了右邊推左邊的條件:
同理把左邊代入右邊:
那么左邊推右邊的條件就是:
真正的反演原理:\((1)(2)\)兩式同時成立,則有反演式\((0)\)成立.
對稱矩陣的反演
推導可知,上述兩個反演式的代數充要條件均為:
於是兩個反演式等價.
反演系數轉移
對於形如上式的帶權反演,我們可以合並系數,將權值轉移到右式.
常規等價反演
根據對稱矩陣反演和反演系數轉移,可以得知以下四種反演是等價的反演:
- 當然反演可以是乘法形式的,仍然存在類似上式的等價形式.
容斥原理
補集轉化
補集轉化又稱為減法原理,若集合\(S\)被划分成了兩部分\(A,\overline{A}\),則\(A\)對象的數目為\(|A|=|S|-|\overline{A}|\).
基本容斥原理
我們假設有全集\(S\),以及\(n\)個集合,每個集合\(A_i\)中的元素具有性質\(P_i\).
現在我們要求不具有任何性質的集合大小,則有如下的計算公式:
移項一下就可以得到另一種等價形式:
兩種形式的容斥原理都具有組合意義:
形式\(1\):不具備任何性質的元素個數 \(=\) 元素總個數 \(-\) 至少具備一個性質的元素個數之和 \(+\) 至少具備兩個性質的元素個數之和 \(-\) 至少具備三個性質的元素個數之和 \(...\)
形式\(2\):所有集合的並集大小 \(=\) 所有集合的大小之和 \(-\) 每兩個集合之間的交集大小 \(+\) 每三個集合之間的交集大小 \(...\)
以下提供一種形式\(2\)的證明:
考慮元素\(x\)被包含在\(k\)個集合中,則它在\(|T|=t,t \leq k\)的時候被計算了\(\binom{k}{t}\)次.
設其總共被計算了\(P\)次,構造\(f(x)=(1-x)^k\),根據二項式定理展開得到:
觀察發現\(f(1)=1-P\),於是得出\(P=1\).
應用\(1\):歐拉函數\(\varphi(n)\)的表達式為\(n\times\prod (1-\frac{1}{p_i})\).
證明:設\(S_i\)代表質因數\(p_i\)在\(1\sim n\)內所有倍數代表的集合,則\(\varphi(n)=n-\left | \bigcup _{i=1}^kS_i \right |\),應用容斥原理,可得\(\varphi (n)=n-\sum_{T\subseteq P}(-1)^{|T|-1}\frac{n}{\prod_{i\in T}p_i}\),提取\(n\),因式分解即可.
應用\(2\):錯位排列\(D_n\)的通項公式為\(n!+\sum_{i=1}^n(-1)^{i}\binom{n}{i}(n-i)!\).
證明:令一個數字排在其原本的位置代表方案具有一個性質,套用容斥原理形式一即可.
應用\(3\):第二類斯特林數\(\begin{Bmatrix}n\\m\end{Bmatrix}\)的表達式為\(\frac{1}{m!}\sum_{i=0}^{m}(-1)^i\tbinom{m}{i}(m-i)^n\).
證明:令一個盒子為空代表具有一個性質,套用容斥原理形式一,除掉盒子標號即可.
應用\(4\):多重集組合數.
證明:公式在常見的組合問題一節中已經給出,把超額使用一類元素看組一個性質,用隔板法計算答案,套用容斥原理形式一即可.
廣義容斥原理
設\(f\),\(g\)為定義在指標集上的函數,則有如下等價關系:
證明:
首先右式代入左式,交換求和號:
最后一步使用了二項式定理的推論\(3\).
右式代入左式的證明過程相似,故定理成立.
快速Mobius變換
在廣義容斥原理的式子中,我們可能需要求解一個數組的高位前綴和,也就是子集和,直接枚舉子集是\(O(3^n)\)的,存在時間復雜度更低的算法.
我們可以考慮對一個集合\(S\)的子集貢獻從高位到低位進行分類:首先是不包含最高位\(1\)子集的貢獻,這其實是一個子問題;其次,包含最高位\(1\)的子集貢獻我們再分為兩類,不包含次高位\(1\)的子集貢獻,這又是一個子問題;剩下同時包含最高位和次高位\(1\)的子集我們再類似地向下分類.
我們可以畫出如上的貢獻圖. 以\(111\)為例,我們想知道它的子集和,首先可以考慮它的最高位\(1\)要不要,如果不要,那么可以直接把\(011\)的子集和累加給它,也就是最后一個粉絲箭頭. 接着考慮要的情況,我們再看次高位的\(1\)要不要,如果不要,那么可以直接把\(101\)的子集和累加給它. 同樣,最高兩位都要的話,可以假設第三位不要,然后把\(110\)的子集和累加給它. 最后就是三位全都要了,顯然他自己對自己也是有貢獻的.
當然我們想要把\(011\),\(101\),\(110\)的子集和累加給\(111\)時,首先得保證它們的子集和已經求好了. 此時最好的方式就是直接按照圖中箭頭從上到下的順序一層一層的枚舉累加,這樣就可以保證跨層詢問子集和的時候一定已經完成累加了.
此時求和算法的時間復雜度類似於分治,有\(T(n)=2T(\frac{n}{2})+\frac{n}{2}\). 容易得知\(T(n)=O(n\log_2 n)\),\(n=2^m\)時,時間復雜度就可以寫成\(O(m\times 2^m)\),\(m\)是元素個數.
還原算法我們稱之為逆\(\mathrm{Mobius}\)變換,只需把貢獻扣掉就好了.
// t = 1 --> FMT , t = -1 --> IFMT
inline void FMT(int *a, int n, int t)
{
for (int i = 1; i < 1 << n; i <<= 1)
// i : the length of contribution arrow
for (int p = i << 1 , j = 0; j < 1 << n; j += p)
// p : the length of section , j : the number of position
for (int k = 0; k < i; k++) a[i+j+k] += t * a[j+k];
// k : go through the section and add contribution
}
二項式反演
令\(f(S)=F(|S|)\),\(g(S)=G(|S|)\),套用廣義容斥原理:
可以把\(|S|\),\(|T|\)直接看成整數,得到:
我們稱這個反演式為二項式反演.
根據反演原理,我們還可以得到另外三種等價形式,其中最常用的是這種:
二項式反演的重要運用是至少和恰好型方案數的轉換.
首先,我們設\(\alpha(k)\)代表所有至少滿足\(k\)的性質的方案數之和.
我們發現\(\alpha(k)\)將具有\(p(p\geq k)\)個性質的元素計算了\(\binom{p}{k}\)次.
假設\(\beta(k)\)代表恰好具有\(k\)個元素的方案數,則有遞推公式如下:
二項式反演,可以得到\(\beta(k)\)的計算式:
應用\(1\):推導錯位排列\(D_n\)的通項公式.
設\(f_i\)代表恰好\(i\)個位置錯排的方案數,則可以進行二項式反演:
應用\(2\):推導第二類斯特林數\(\begin{Bmatrix}n\\m\end{Bmatrix}\)的表達式
假設盒子有標號,設\(f_i\)代表恰好\(i\)個盒子非空的方案數,則可以二項式反演,答案除掉盒子標號即可:
應用\(3\):球染色問題:有\(n\)個球排成一行,你有\(k\)種顏色,要求給每一個球染色,相鄰兩個球顏色不可以相同,並且每種顏色至少使用一次,求方案數.
假設\(f_i\)代表恰好使用\(i\)種顏色的方案數,則可以二項式反演:
Min-Max容斥
首先我們把一個整數\(n\)看成一個集合\(S(n)=\{1,2,\cdots,n\}\),那么:
可以用容斥原理改寫\(\max\)的表達式:
於是就可以得到:
把\(\min\max\)反過來該式也成立,在期望意義下該式也成立.
Kth Min-Max容斥
我們可以套用一般\(\min-\max\)容斥的式子猜想一個\(k\)大值容斥的形式:
其中\(f(|T|)\)是容斥系數,具體是多少還不知道.
第\(x+1\)大的元素顯然會被統計到\(\sum_{i=0} ^x {x\choose i} f(i+1)\)次,我們可以直接令\([x+1=k]=\sum_{i=1}^x {x \choose i}f(i+1)\),於是就可以二項式反演,得到:
化簡得到容斥系數\(f(x)=(-1)^{x-k}{x-1 \choose k-1}\).
高維Min-Max容斥
定義多元組的\(\min\)算符為:\(\min((x_1,x_2,\cdots,x_n),(y_1,y_2,\cdots,y_n))=(\min(x_1,y_1),\min(x_2,y_2),\cdots,\min(x_n,y_n))\).
可以證明,原來的\(\min-\max\)容斥在高維情況下也成立.
設\(n=\prod_{i=1}^kp_i^{a_i}\),每個正整數的代表元素組為\((a_1,a_2,\cdots,a_k)\),那么該意義下的高維\(\min-\max\)容斥就等價於:
Epilogue
第一篇總結現已施工完畢,如有錯誤請提出.