淺談生成函數之OGF
表示序列的一種有效方法就是生成函數,它把序列的項作為一個形式冪級數中變數 的冪的係數。可以用生成函數求解許多類型的計數問題,例如在各種限制下選取或分配不同種類的物體的方式數,使用不同的面額的營比換一美元的方式數等。也可以用生成函數求解遞推關係。它先把關於序列的項的遞推關係轉換成涉及生成函數的方程,然後求解這個方程並找出關於這個生成函數的直接表達形式。從這個直接表達形式可以找到生成函數的冪級數的係數,從而求解原來的遞推關係。生成函數甚至可以利用函數之間的關係來證明組合恆等式,因為這些關係可以轉換成涉及序列的項的恆等式。
普通生成函數(OGF)
定義(OGF). 實數序列 的普通生成函數是無窮級數
來看一些基本的例子:
例1. 序列 的生成函數分別是
特別地,我們可以通過設置 這些項的係數,把一個有限序列, 擴充成一個無限序列,就可以定義一個實數的有限序列的生成函數。這個無限序列 的生成函數 是一個 次多項式,因為當 的時候沒有形如 的項出現,即
例2. 序列 的生成函數為 。
右邊的式子看起來像等差數列求和?答案是 ,那 的時候豈不是沒有定義了?
注意我們一直把生成函數稱為形式冪級數,就是說它是一個形式,其實是不考慮它的解析意義的。在之後的討論中,對於一個冪級數我們也不再關心它的收斂性,並且對於一個封閉形式我們也只考慮它的麥克勞林級數。(也就是在 處的泰勒展開)
例3. 函數 是序列 的生成函數。
進行麥克勞林展開有
例4. 是序列 的生成函數。
進行麥克勞林展開有
知道了基本的例子之後,再來考慮以下定理:
定理. 令 , ,那麼有 和
有啥用呢?請看這個例子。
例6. 設 ,求出它的冪級數。
當然可以對其直接麥克勞林展開,利用公式
得到
現在想一下用剛才的定理怎麼做。把它看成是兩個 相乘,那麼有
定理(廣義二項式定理). 設 ,那麼
可以使用麥克勞林級數的理論證明定理2。有興趣的讀者可以查看相關資料。
例7. 設 ,,使用廣義二項式定理求 和 的生成函數。
由於有 ,於是用 代替 得到 。
其中比較重要的一個生成函數是當 時, 。
下面一起來看一下如何用生成函數解決計數問題。
例8. 設 ,並設數列 ,其中 代表方程 的非負整數解的數目。
用簡單的的隔板法可得 。它的生成函數是 。這個的封閉形式我們也早已瞭解,就是 。回憶一下,這個封閉形式其實可以用乘法表示為 個 相乘的形式。寫成冪級數相乘就是 。在上面的記法中, 是第一個因子的代表項, 是第二個因子的代表項, , 是第 個因子的代表項。將這些代表項乘起來,得到 ,當且僅當 .
於是上面的冪級數的展開式乘起來後 的係數等於原方程 的非負整數解的個數。
由此,生成函數的係數和方案數的關係也就更加明顯了。再來繼續看一個例子
例9. 確定蘋果、香蕉、橘子和梨的 組合的個數,其中在每個 組閤中蘋果的個數是偶數,香蕉的個數是奇數,橘子的個數在 和 之間,而且至少要有一個梨。
首先方案數等價於求出方程 的非負整數解的個數 ,其中 , , , 。為每種類型的水果創建一個因子 ,其指數為該類型水果的 組閤中所允許的數量:
注意到
因此 ,這個函數的麥克勞林級數中第 項的係數便為所求的答案。
Ex:有無限多的一分,五分,一角,兩角五分和五角的硬幣。試確定用這些硬幣湊成 分錢的方法法數。
提示:作換元。
答案:生成函數為
這裡推薦一個視頻,講的非常清楚,如果不懂什麼意思的話強烈建議食用。
https://www.youtube.com/watch?v=bfFQLSIuQQk 生成函數教程(侵刪) https://www.zhihu.com/video/1059077252406382592到這裡不知到大家是否有一個疑問:生成函數用來求解數列相關的問題,那麼和數列的遞推式又有怎樣的聯繫?
例10. 求解遞推關係 ,初始條件為
聰明的孩子(劃掉)正常人都能一眼看出來它的通項公式為 。這裡從生成函數的角度加以分析:
設是序列 的生成函數,即 。首先注意 ,利用遞推關係可以得到
所以有 。求解 ,解得 。使用恆等式 ,有 。
於是 。
是不是覺得非常妙?練習一下。
Ex:求解遞推式 ,初始條件為 。使用生成函數找出 的顯示公式。
設 (擴充序列,方便推導)
用 乘遞推關係的兩邊得 。設 是序列 的生成函數。從 開始兩邊求和,得到
解得 。
下面怎麼做?似乎有些走投無路了?
這裡要用到一個技巧,就是展開為部分分式:
於是就可以輕鬆地得到: ,所以
這麼愉快?下面來看幾道OI題吧!
BZOJ3028食物
BZOJ3028明明這次又要出去旅遊了,和上次不同的是,他這次要去宇宙探險!
我們暫且不討論他有多麼NC,他又幻想了他應該帶一些什麼東西。理所當然的,你當然要幫他計算攜帶 件物品的方案數。他這次又準備帶一些受歡迎的食物,如:蜜桃多啦,雞塊啦,承德漢堡等等當然,他又有一些稀奇古怪的限制:每種食物的限制如下:
承德漢堡:偶數個可樂:個或個雞腿:個,個或個蜜桃多:奇數個雞塊: 的倍數個包子:個,個,個或個土豆片炒肉:不超過一個。麵包:的倍數個注意,這裡我們懶得考慮明明對於帶的食物該怎麼搭配著喫,也認為每種食物都是以『個』為單位(反正是幻想嘛),只要總數加起來是 就算一種方案。因此,對於給出的 ,你需要計算出方案數,並對 取模。
直接寫式子了
所以 的係數為 。
BZOJ3027Sweet
BZOJ3027有 種糖果,每種 個,至少喫掉 個,至多 個,求喫掉糖果的方案數
每種糖果的生成函數:
然後乘起來:
暴力展開後面的式子,最多 非零項。對於前面的式子, 的係數由隔板法,為 。對於後面的 項對答案的貢獻是
添項拆項,上式等於 。於是做完了,時間複雜度為
附:好題推薦
BZOJ4001 - BZOJ-4001. [TJOI2015]概率論(生成函數與遞推式的關係)
BZOJ3456 - BZOJ-3456. 城市規劃 - Miskcoos Space
BZOJ3684 - BZOJ 3684: 大朋友和多叉樹 [拉格朗日反演 多項式k次冪 生成函數]
BZOJ3771 - 【bzoj3771】Triple FFT+容斥原理
系列文章下一篇:
FFjet:淺談生成函數之EGF順便安利一下博客(逃)
推薦閱讀: