生成函式 趣味知識
分拆數與尤拉五邊形數定理
尤拉五邊形數定理小記
Cayley 公式
\(n\) 個點的有標號有根樹個數為 \(n^{n-1}\),\(n\) 個點的有標號無根樹個數為 \(n^{n-2}\)。
這兩點可以用 Prufer 序列極為簡單地證明出來,也可以用 matrix-tree 定理較為簡單地證明。
當然也可以使用生成函式證明。
記 \(\hat G(x)\) 表示 \(n\) 個點有標號的有根樹的個數的 EGF。
那麼考慮他的兒子,容易列出等式:
然後構造一個 EGF \(\hat F(x)=x\exp (-x)\)。
會發現 \(\hat F(x),\hat G(x)\) 互為複合逆。
然後有拉格朗日反演:
我們就得到了 \(n![x^n]\hat F(x)=n^{n-1}\)。
ex - 有根森林與固定根樹的計數
對於 \(n\) 個點的有根森林,顯然可以與 \(n+1\) 個點的無根樹構成雙射,理由是存在可逆構造方法:將後者中的編號為 \(n+1\) 的點刪去,一定得到不同的無根樹,否則存在某兩棵樹相同;反之亦然。
因此 \(n\) 個點的有根森林的個數為 \((n+1)^{n-1}\)。
同時假定要求 \(1,\cdots,k\) 分別為 \(k\) 個連通部分的有根森林的根,記它的個數為 \(T_{n,k}\),則有 \(T_{n,k}=kn^{n-k-1}\)。
考慮歸納法證明,假設對於 \(n'<n\) 的 \(\forall T_{n',k}\)滿足上述命題。
考慮:
上式的組合意義是在 \(n\) 個點中選擇編號最小的根去掉,列舉 \(j\) 為這個根的兒子數量,同時組合數是在考慮標號。
exp 和 ln 的組合意義
對於 \(x\) 而言,我們知道有泰勒展開式:
因此在我們要計算多重集問題但是同時不考慮順序時可以使用上述的技巧去掉一些不易去除的係數。
考慮對於集合劃分問題:
一個集的貢獻的生成函式應該為:
現在考慮兩個集的情況,實際上它的生成函式應該是:
因為會發現卷積的組合意義對於 \(x^{a+b}\) 來說是有先後順序的,\(a=b\) 時也是如此,比如 \([1,2,3,4]\) 中第一次選擇了 \([1,2]\) 而第二次選擇 \([3,4]\),實際上和第一次選擇 \([3,4]\) 而第二次選擇 \([1,2]\) 的意義是一樣的,但是在 EGF 中會算兩次,因此我們需要除掉這個係數。
而更高次項也是如此,因此,最後由任意多個環構成的圖的生成函式應該如下:
實際上在考慮圓排列時 \(\ln\) 的應用也存在,這裡就不展開了。
生成函式 練習題
HDU-2065
statement
給出 \(n\) ,要求以四種字元組成長度為 \(n\) 的序列,並且要求給定的兩種字元恰好出現偶數次。
solution
HDU-2152
statement
\(n\) 種水果,每種水果最多買 \(b_i\) 個,最少買 \(a_i\) 個,問有多少種購買方案。
solution
其實可以揹包,但是應該練習 GF。
HDU-1709
statement
給出 \(n\) 個砝碼,問有哪些比砝碼總重量小的重量無法稱出。
solution
揹包或者 GF。GF 可以用分治 FFT。
Codeforces-891E
statement
給出 \(n\) 個數 \(a_1,a_2,\dots,a_n\) 。
接下來要進行 \(k\) 次操作,每次隨機選擇一個數 \(x \in [1,n]\),把 \(a_x\) 減一,並將答案增加除 \(a_x\) 外所有數的乘積。
求最終答案的期望,答案對 \(10^9 + 7\) 取模。
\(n\le 5000;a_i,k\le10^{9}\)。
solution
容易發現每次的變化量實際上是 \(-\prod a_i\) 的變化量,因此答案應該等於 \(\prod a_i-\prod (a_i-b_i)\)。
因此求後面的期望:
令:
因此有:
時間複雜度 \(O(n^2)\) 或 \(O(n\log_2^2n)\) (分治求卷積),瓶頸在於求 \(\prod (a_i+x)\) 的各項係數。
Atcoder-abc241h
statement
有一些卡牌,每張卡牌上有一個數字,具體的,有 \(b_i\) 張卡牌上的數字為 \(a_i\)。
求出拿走其中 \(m\) 張卡牌的貢獻之和。貢獻為這些卡牌的乘積。對於本質相同的卡牌組合,只算一次。
答案對 \(998244353\) 取模。
\(n\le 16;m\le 10^{18};b_i\le 10^{17};a_i<\mathrm{mod}\)。
solution
考慮:
問題在於如何求出 \(\lambda_i\)。
發現 \(\sum \lambda_i \prod_{i\ne j}(1-a_jx)=1\),因此對於 \(\lambda_k\) 我們令 \(x=\frac{1}{a_k}\),這樣和式中只有 \(i=k\) 位置上的值不為 \(0\)。因此:
至於為什麼一定存在這樣的 \(\lambda\),帶進去化簡就可以得到了。
LibreOJ-#6570
statement
定義毛毛蟲樹為一棵樹,滿足存在一個鏈,所有點到鏈的距離小於等於 \(1\)。
計數 \(n\) 個點的有標號毛毛蟲樹的個數,答案對 \(998244353\) 取模。
\(n\le 10^5\)。
solution
容易想到一種簡單的思路,即根據鏈把點進行劃分,然後指數生成函式計數,但是問題是兩邊的端點會寄掉。
因此強制令兩邊的端點必須接上其他點。
把中間的生成函式記為 \(\hat F(x)\),兩端的記為 \(\hat G (x)\)。則有:
而答案就是:
但是這個值有兩點問題,一是沒有考慮菊花的情況,二是首尾顛倒算一種。因此:
Luogu-P6049
statement
求 \(n\) 個點的帶權帶標號有根樹的個數,其中權值滿足父親的權值大於等於兒子的,且權值範圍為 \([1,m]\)。
答案對 \(998244353\) 取模。
\(n\le 400,m< 998244353\)
solution
首先有一個性質就是答案是一個關於 \(m\) 的 \(n\) 次多項式。
證明:會發現只需要考慮相對的權值大小,乘上組合數即可。而出現的不同權值個數最多隻有 \(n\) 個。
於是令 \([x^n]\hat F_k(x)\) 表示考慮根的權值為 \(k\) 時大小為 \(n\) 的樹(滿足題目要求)的個數,然後記 \(\hat G_k(x)\) 表示其字首和。
因此考慮求出 \(\forall k\in[1,n+1],[x^n]\hat G_k(x)\)。
而後很容易透過組合意義列出式子:
然後因為存在一種 \(O(n^2)\) 遞推 \(A(x)[1,\cdots,n]\to \exp(A(x))[1,\cdots,n]\) 的方法:
我們將 \(\exp(A(x))[1,\cdots,n]\) 記為 \(\exp_n(A(x))\)
因此我們可以在 \(O(n^3)\) 的時間複雜度內求出 \(\forall k\in[1,n+1],[x^n]\hat G_k(x)\)。
然後拉格朗日插值公式求出這個多項式在 \(m\) 處的取值。