0. 前置
1. 廣義二項式定理(牛頓二項式定理)
我們重新定義組合數:
其中 \(r^{\underline{k}}\) 是下降冪,\(r\in\mathbb C,k\in\mathbb N\) .
注意 \(r\in\mathbb C\) . 在這種情況下,對於任意 \(\alpha\in\mathbb C\),有:
2. 雙階乘
當 \(n\in\mathbb N_+\) 時,\(n\) 的雙階乘(\(n!!\))表示不超過 \(n\) 且與 \(n\) 有相同奇偶性的所有正整數的乘積。
顯然有遞推式 \((n-2)!!n=n!!\),由此可以推導出:
對於雙階乘有如下恆等式:
3. 一些展開式
1. 形式冪級數的定義及基礎運算(可略)
定義 形式冪級數(以下簡稱冪級數)為一個形如 \(a_0+a_1x+a_2x^2+\cdots\) 形式的表達式。(注意:這里只是形式,不需要在意它表示什么),序列 \(\{a_n\}\) 稱之為它的 系數序列。稱兩個冪級數 相等 當且僅當它們的系數序列相同。
為簡便,記 \([x^n]f(x)\) 表示冪級數 \(f\) 的 \(n\) 次項系數。另外,也用 \(f(0)\) 表示 \(f\) 的 \(0\) 次項系數。
我們可以對其做一些運算,例如 加法 或 減法。其定義是:
冪級數的乘法由卷積來定義,即:
其中
現在你可以驗證其滿足各種我們所熟知的規律,比如加法交換律、加法結合律、乘法交換/結合律、乘法分配律等等(因此它們構成了一個環)。這些都很簡單。
等下,說好的四則運算呢?還差一個除法 \(\cdots\) 顯然要定義除法,只需要定義逆元即 \(f^{-1}\)。但是有些冪級數是不可能有逆元的,比如首項系數為 \(0\) 的冪級數。事實上這也是充要條件,即
冪級數 \(f(x)=\sum_n a_nx^n\) 存在逆元當且僅當 \(a_0\neq 0\)
Proof:
必要性顯然,因為若 \(a_0=0\) 那么 \(f\) 與任意冪級數的乘積的零次項系數都是 \(0\) .
設 \(f^{-1}=\sum_n b_nx^n\),那么 \(f\cdot f^{-1}=1 \Longrightarrow \sum_k a_kb_{n-k}=[n=0]\),於是只需要令
\[b_n=\dfrac 1{a_0}\left([n=0]-\sum_{k>0}a_kb_{n-k}\right) \]即可。
\(\Huge \tag* □\)
2. 生成函數
生成函數(Generating Function)又稱母函數,是處理組合數學問題的一大利器。
它是一種形式冪級數,其每一項的系數可以提供關於這個序列的信息。
生成函數有許多不同的種類,但大多可以表示為單一的形式:
其中 \(k_n(x)\) 被稱為核函數。不同的核函數會導出不同的生成函數,擁有不同的性質。舉個例子:
- 普通生成函數:\(k_n(x)=x^n\);
- 指數生成函數:\(k_n(x)=\dfrac{x^n}{n!}\);
- 狄利克雷生成函數:\(k_n(x)=\dfrac{1}{n^x}\) .
同形式冪級數,我們常用 \([k_n(x)]F(x)\) 來表示它的第 \(n\) 項的核函數對應的系數,也就是 \(a_n\) .
1. 普通生成函數(OGF)
OGF 一般用來解決無標號有序的計數問題。
1. 定義
對於序列 \(f=\langle f_0,f_1,f_2,\cdots\rangle\) 的普通生成函數(Ordinary Generating Function,OGF)為形式冪級數
若已知序列 \(\langle f_0,f_1,f_2,\cdots\rangle\),那么它的 OGF \(F(x)\) 也隨之確定;反之,如若以求得序列的 OGF \(F(x)\),則該序列也隨之確定。
常見 OGF:
OGF | 序列 |
---|---|
\(1\) | \(\langle 1,0,0,0\cdots\rangle\) |
\(\dfrac{1}{1-x}\) | \(\langle 1,1,1,1,\cdots\rangle\) |
\(\dfrac{1}{(1-x)^2}\) | \(\langle 1,2,3,4,\cdots\rangle\) |
\(\dfrac{1}{1+x}\) | \(\langle 1,-1,1,-1,\cdots\rangle\) |
\((1+x)^2\) | \(\langle 1,2,1,0,0,0,\cdots\rangle\) |
\((1+x)^4\) | \(\langle 1,4,6,4,1,0,0,0,\cdots\rangle\) |
對於 \(\langle 1,1,1,1,,\cdots\rangle\) 的 OGF 是 \(\dfrac{1}{1-x}\),是因為 \(1+x+x^2+x^3+\cdots\) 在 \(x\in(-1,1)\) 的時候,用等比數列求和公式:
這是因為 \(\lim_{n\to \infty}x^n\) 在 \(x\in(-1,1)\) 的時候收斂,值為 \(0\) .
因為形式冪級數只是個形式,隨便限制定義域沒關系的。
由上式顯然可以得到
只要罷 \(X=x^k\) 代入即可。
把這個式子兩端平方,得:
同理,把它兩端 \(k\) 次方,得到:
2. 性質
根據 OGF 的定義,容易發現 OGF 的運算和數列運算之間的關系:
注意最后一項是卷積的形式,這表明了 OGF 的乘積對應數列卷積。
通過上面的運算規則可以推出下面的式子:
OGF | 序列 |
---|---|
\(\dfrac{1}{1-cx}\) | \(\langle 1,c,c^2,c^3\cdots\rangle\) |
\((1-x)^{-n}\) | \(\left\langle 1,n,\dbinom{n+1}{2},\dbinom{n+1}{3},\cdots\right\rangle\) |
\(\ln \dfrac{1}{1-x}\) | \(\left\langle 0,1,\dfrac 12,\dfrac 13\cdots\right\rangle\) |
\(\ln(1+x)\) | \(\left\langle 0,1,-\dfrac 12,\dfrac 13,-\dfrac 14\cdots\right\rangle\) |
\(e^x\) | \(\left\langle 1,1,\dfrac 12,\dfrac 16,\dfrac{1}{24}\cdots\right\rangle\) |
你會發現以上都是一些看上去很簡單的東西。那么生成函數到底哪里厲害了呢?
3. 示例
示例 1(Fibonacci 數列通項)
求 Fibonacci 數列通項,其中 Fibonacci 數列為 \(f_n=\begin{cases}1 &n\le 1\\f_{n-1}+f_{n-2} &n>1\end{cases}\) .
設 \(F(x)=f_0+f_1x+f_2x^2+f_3x^3+\cdots\),顯然有:
前式減后式得 \(x+x^2F(x)\),故 \(F(x)=\dfrac{x}{1-x-x^2}\) .
注意到 \(1-x-x^2=\left(1-\dfrac{1-\sqrt 5}{2}x\right)\left(1-\dfrac{1+\sqrt 5}{2}x\right)\),故:
這就成了兩個等比數列求和公式乘個常數再相加的形式了!把兩個等比數列還原成數列,得到
示例 2(Catalan 數列通項)
求 Catalan 數列通項,其中 Catalan 數列為 \(H_n=\begin{cases}1&n=0\\\sum\limits_{i=0}^{n-1}H_iH_{n-i-1}&n>0\end{cases}\)
當然也構造生成函數
故 \(xH^2(x)-H(x)+1=0\),解得 \(H(x)=\dfrac{1\pm\sqrt{1-4x}}{2x}\)
那么這就產生了一個問題:我們應該取哪一個根呢?我們將其分子有理化:
代入 \(x=0\) 得到的是 \(H(x)\) 的常數項 \(H_0\),當 \(H(x)=\dfrac{2}{1+\sqrt{1-4x}}\) 時有 \(H(0)=1\),滿足要求,而另一個解會出現分母為 \(0\) 的情況(不收斂),舍棄。
接下來我們要將其展開。但注意到它的分母不是斐波那契數列那樣的多項式形式,因此不方便套用等比數列的展開形式。在這里我們需要使用牛頓二項式定理。我們來先展開 \(\sqrt{1-4x}\):
注意到
這里使用了雙階乘的化簡技巧。那么帶回 \((1)\) 得到
帶回原式得到
這樣我們就得到了卡特蘭數的通項公式。
示例 3
在一個圓上的 \(n\) 個點間,畫出彼此不相交弦的全部方法的總數被稱為默慈金數。它的前幾項為 \(M_0=1,M_1=1,M_2=2,M_3=4,M_4=9\) 其遞推式為:
設生成函數為 \(G(x)\),有:
解得 \(G(x)=\dfrac{1}{2x^2}\left[1-x-(1-2x-3x^2)^{\frac{1}{2}}\right]\),用牛頓二項式定理:
示例 4
有三種物品,分別有 \(3,2,3\) 個,問拿出 \(4\) 個進行組合(無序)的方案數是多少。
對每個物品構造一個序列 \(\{a_n\}\),\(a_i\) 表示取了 \(i\) 個的方案數。
容易發現,這三個序列的 OGF 分別是:
- \(F_1(x)=1+x+x^2+x^3\);
- \(F_2(x)=1+x+x^2\);
- \(F_3(x)=1+x+x^2+x^3\);
把它們乘起來然后取第 \(4\) 項系數即可。
示例 5(經典題)
在許多不同種類的食物中選出 \(n\) 個,每種食物的限制如下:
- 承德漢堡:偶數個
- 可樂:\(0\) 個或 \(1\) 個
- 雞腿:\(0\) 個,\(1\) 個或 \(2\) 個
- 蜜桃多:奇數個
- 雞塊:\(4\) 的倍數個
- 包子:\(0\) 個,\(1\) 個,\(2\) 個或 \(3\) 個
- 土豆片炒肉:不超過一個
- 面包:\(3\) 的倍數個
每種食物都是以「個」為單位,只要總數加起來是 \(n\) 就算一種方案。對於給出的 \(n\) 你需要計算出方案數,對 \(10007\) 取模。
把每種食物的 OGF 寫出來:
- 承德漢堡:\(1+x^2+x^4+\cdots=\dfrac{1}{1-x^2}\)
- 可樂:\(1+x\)
- 雞腿:\(1+x+x^2=\dfrac{1-x^3}{1-x}\)
- 蜜桃多:\(x+x^3+x^5+\cdots=x(1+x^2+x^4+\cdots)=\dfrac{x}{1-x^2}\)
- 雞塊:\(1+x^4+x^8+\cdots=\dfrac{1}{1-x^4}\)
- 包子:\(1+x+x^2+x^3=\dfrac{1-x^4}{1-x}\)
- 土豆片炒肉:\(1+x\)
- mian 包:\(1+x^3+x^6+\cdots=\dfrac{1}{1-x^3}\)
全乘起來,很多都約掉了,得到 \(\dfrac{x}{1-x^4}\),即
因此答案就是 \(\dbinom{n+2}{n-1}=\dbinom{n+2}{3}\) .
示例 6(背包)
Euler 無標號計數:
你有很多物品,體積為 \(i\) 的有 \(a_i\) 種,每種物品數量無限。求選取物品使得它們大小之和恰好為為 \(n\) 的方案數,元素無序。
這不就是背包問題嗎?所以背包問題是最經典的無標號計數。
其實這題和 OGF 根本沒有關系,背包裸題,寫個 dp 即可。
如果按照原來的思路直接上 OGF 顯然會暴斃。因為這道題裝物品這個動作已經變成無序的了。
於是我們考慮拿了體積為 \(i\) 的物品多少個這個問題,驚奇的發現這個問題就是可以強行欽定順序的了!我們可以先嘗試拿了多少個體積為 \(1\) 的,再嘗試拿了多少個體積為 \(2\) 的 \(\cdots\)
由於體積為 \(i\) 的有 \(a_i\) 種,於是如果我們只拿體積為 \(i\) 的能組成每個體積的方案數量為
我們就得到了 Euler 變換:
往往這種不太好處理的求積可以先 \(\ln\) 再 \(\exp\):
設 \(\{a_ix^i\}\) 的生成函數是 \(G(x)\),那么
這樣我們就知道了
這個枚舉 \(j\) 算出 \(\dfrac{G(x_j)}{j}\) 算出來求和再 \(\exp\) 就完了,復雜度 \(O(n\log n)\) .
例題:
示例 6(推恆等式)
顯然:
把這兩個相乘得到:
令這個等式兩端 \(x^n\) 的系數相等,得:
我們就發現了范德蒙德卷積!
示例 7
休閑娛樂一下:
拯救世界:
我們要召喚 kkksc03 和 lzn 兩位大神,召喚他們需要五行神石。
kkksc03 大神召喚方法:
- 金神石的塊數必須是 \(6\) 的倍數。
- 木神石最多用 \(9\) 塊。
- 水神石最多用 \(5\) 塊。
- 火神石的塊數必須是 \(4\) 的倍數。
- 土神石最多用 \(7\) 塊。
lzn 大神召喚方法:
- 金神石的塊數必須是 \(2\) 的倍數。
- 木神石最多用 \(1\) 塊。
- 水神石的塊數必須是 \(8\) 的倍數。
- 火神石的塊數必須是 \(10\) 的倍數。
- 土神石最多用 \(3\) 塊。
有 \(n\) 塊混沌之石,這 \(n\) 塊混沌之石可以被認為是任意一種五行神石,求召喚這兩位大神的方案數。
kkksc03:
- 金神石:\(1+x^6+x^{12}+\cdots=\dfrac{1}{1-x^6}\)
- 木神石:\(1+x+x^2+\cdots+x^9=\dfrac{1-x^{10}}{1-x}\)
- 水神石:\(1+x+x^2+\cdots+x^5=\dfrac{1-x^6}{1-x}\)
- 火神石:\(1+x^4+x^8+\cdots=\dfrac{1}{1-x^4}\)
- 土神石:\(1+x+x^2+\cdots+x^7=\dfrac{1-x^8}{1-x}\)
lzn:
- 金神石:\(1+x^2+x^4+\cdots=\dfrac{1}{1-x^2}\)
- 木神石:\(1+x=\dfrac{1-x^2}{1-x}\)
- 水神石:\(1+x^8+x^{16}+\cdots=\dfrac{1-x^8}{1-x}\)
- 火神石:\(1+x^{10}+x^{20}+\cdots=\dfrac{1}{1-x^{10}}\)
- 土神石:\(1+x+x^2+x^3=\dfrac{1-x^4}{1-x}\)
乘起來就是
所以答案就是 \(\dbinom{k+4}{k}=\dfrac{(k+1)(k+2)(k+3)(k+4)}{24}\) .
注意高精要寫 NTT .
Tips
有些題不用對 OGF 進行推導,直接暴力乘開(或者 NTT?)即可。
2. 指數生成函數(EGF)
EGF 一般用來解決有標號有序的計數問題。
1. 定義
對於序列 \(f=\langle f_0,f_1,f_2,\cdots\rangle\) 的普通生成函數(Exponential Generating Function,EGF)為形式冪級數
同樣的,若已知序列 \(\langle f_0,f_1,f_2,\cdots\rangle\),那么它的 EGF \(\hat F(x)\) 也隨之確定;反之,如若以求得序列的 EGF \(\hat F(x)\),則該序列也隨之確定。
注意指數生成函數的乘法運算:對於兩個序列 \(a,b\) ,設它們的指數生成函數分別為 \(\hat{F}(x),\hat{G}(x)\) ,那么
因此 \(\hat{F}(x)\hat{G}(x)\) 是序列 \(\left\langle \sum\limits_{i=0}^n \dbinom{n}{i}a_ib_{n-i} \right\rangle\) 的指數生成函數。
多出來的 \(\dbinom ni\) 告訴我們它適用於排列的計算(相對於 OGF 的普通卷積對應組合)
2. 性質
EGF 運算法則:
同樣有一些基本的 EGF:
EGF | 數列 |
---|---|
\(e^x\) | \(\langle1,1,1,\cdots\rangle\) |
\(xe^x\) | \(\langle0,1,2,\cdots\rangle\) |
\(e^{cx}\) | \(\langle 1,c,c^2,\cdot\rangle\) |
\(\cdots\) | \(\cdots\) |
其實你只需要注意到 \(\langle f_n\rangle\) 的 EGF 實際上就是 \(\langle \dfrac{f_n}{x!}\rangle\) 的 OGF,就能找到不少例子。
那么 EGF 哪里又厲害了呢?
3. 示例
示例 1(圓排列 多項式 exp)
長度為 \(n\) 的排列數的指數生成函數是
圓排列的定義是把 \(1,2,\cdots,n\) 排成一個環的方案數。也就是說旋轉后的方案的等價的(但翻轉是不等價的)。
\(n\) 個數的圓排列數顯然是 \((n-1)!\) 。因此 \(n\) 個數的圓排列數的指數生成函數是
也就是說 \(\exp \hat{Q}(x)=\hat{P}(x)\) 。但這只是數學層面的推導。我們該怎樣直觀理解:圓排列數的 EGF 的 \(\exp\) 是排列數的 EGF?
一個排列,是由若干個置換環構成的。例如 \(p=[4,3,2,5,1]\) 有兩個置換環:
(也就是說我們從 \(p_i\) 向 \(i\) 連有向邊)
而不同的置換環,會導出不同的排列。例如我將第二個置換環改成
那么它對應的排列就是 \([5,3,2,1,4]\) 。
也就是說,長度為 \(n\) 的排列的方案數是
- 把 \(1,2,\cdots,n\) 分成若干個集合
- 每個集合形成一個置換環
的方案數。而一個集合的數形成置換環的方案數顯然就是這個集合大小的圓排列方案數。因此長度為 \(n\) 的排列的方案數就是:把 \(1,2\cdots,n\) 分成若干個集合,每個集合的圓排列方案數之積。
這就是多項式 \(\exp\) 的直觀理解。
推廣之
- 如果 \(n\) 個點 帶標號 生成樹的 EGF 是 \(\hat{F}(x)\) ,那么 \(n\) 個點 帶標號 生成森林的 EGF 就是 \(\exp \hat{F}(x)\) ——直觀理解為,將 \(n\) 個點分成若干個集合,每個集合構成一個生成樹的方案數之積。
- 如果 \(n\) 個點帶標號無向連通圖的 EGF 是 \(\hat{F}(x)\) ,那么 \(n\) 個點帶標號無向圖的 EGF 就是 \(\exp \hat{F}(x)\) ,后者可以很容易計算得到 \(\exp \hat{F}(x)=\sum\limits_{n\ge 0}2^{\binom{n}{2}}\dfrac{x^n}{n!}\) 。因此要計算前者,只需要一次多項式 \(\ln\) 即可。
Reference
- 淺談 OI 中常用的一些生成函數運算的合法與正確性 - _rqy
- 生成函數簡介 - _rqy
- 生成函數簡介 - OI Wiki
- 普通生成函數 - OI Wiki
- 組合數學——母函數與遞推 - 朱全民
- 趣談生成函數 =v= - 胡小兔
- 小學生都能看懂的生成函數入門教程 - 自為風月馬前卒;牛客版;知乎版
- 利用生成函數求斐波那契數列通項公式 - 自為風月馬前卒
- 雙階乘 - 百度百科
- 生成函數及應用 - ACdreamer
- 生成函數與組合計數初探 - yijan
- 題解 P4389 【付公主的背包】 - command_block
- [數學記錄]P5900 無標號無根樹計數 - command_block
- 多項式計數雜談 - command_block
- Concrete Mathematic \(\;\) A Foundation for Computer Scinece, Second Edition - Ronale L. Graham ; Donale E. Knuth ; Oren Patashink
- 指數生成函數 - OI Wiki