普通生成函数
生成函数即母函数(generating function),是一种解决计数问题的强有力的工具。它能将一个序列的信息映射到一个形式幂级数 \(f(x)\) 上,其每一项的系数可以提供关于这个序列的信息。
生成函数一般分为普通型生成函数和指数型生成函数两种。
本文先介绍普通生成函数相关内容。
tips:本文求和符号上界没有的话默认为 \(\infty\)。
普通生成函数
定义
对于一个序列 \(a\),定义 \(a\) 的普通生成函数(Ordinary generating function,简称 OGF)为:
长得很像多项式(只不过无上限),又记作:
其中,这个 \(x\) 没有什么具体意义,只是一个占位符,一般来说 \(x\in(-1,1)\)。
这样说可能很抽象,我学的时候也没听懂,举个例子:
有一个序列 \(a=\left\{1,1,4,5,1,4\right\}\),我们考虑用函数来表达这个序列。
我们把 \(a\) 的每一项当作一个多项式的系数,于是得到了一个多项式系数:\(f(x)=1+x+4x^2+5x^3+x^4+4x^5\)。
你看,这样是不是就可以表示上面这个序列了。
一些记号
- 我们可以提取生成函数第 \(i\) 项的系数,记作:
举个例子,比如提取 \(1+x-8x^2+7x^3\) 的二次项系数可以简记为 \([x^2](1+x-8x^2+7x^3)\) 。
- \((\bmod\ x^n)\) 表示将形式幂级数截断⾄ \(x^{n-1}\) 项,也就是只保留生成函数中次数小于 \(n\) 的项,而忽略所有次数大于等于 \(n\) 的项。
例如,\(f(x)=1+x+x^2+x^3+\cdots\),而 \(f(x)(\bmod\ x^3)=1+x+x^2\)
知识引入(二项式定理)
这是一般的二项式定理:
定义组合数:\(\binom{r}{k}=\frac{r \underline{\underline{k}}}{k!}(r \in \mathbb{C}, k \in \mathbb{N})\)。
其中 \(r^{\underline{\underline{k}}}=r(r-1)(r-2)\cdots(r-k+1), ~ r^{\underline{0}}=1\),\(k!\) 是阶乘。
这样就可以扩展二项式定义为:
\(\alpha\) 是任意实数。
一些生成函数(及其推导)
- \(a_n=1\) 的生成函数:
这是怎么算的呢?首先,根据等比数列求和公式,我们知道:
当 \(n\) 趋近于无穷大时,因为 \(x\in(-1,1)\),所以 \(x^{n+1}\) 趋近于 \(0\)。
所以说:
这是一个重要性质,对于 \(|r|<1\),有
注意,这里的 \(n\) 是无穷大的,所以可以这么写,但题目一般都是有限的,所以实际算的时候不能直接代入,只能老老实实算。
- \(a_n=2^n\) 的生成函数是:
这种形式就与上面的通项非常相似,\(r=2x\)。
当 \(|r=2x|<1\) 时,也就是 \(|x| < \frac12\) 时,级数收敛,所以:
- \(a_n=\binom{m}{n}\) 的生成函数:
这其实就是二项式定理,很好看出来吧。
- \(a_n=[n \bmod 2 = 0]\) 的生成函数:
这其实就是公比为 \(x^2\) 的等比数列,代入求和公式就是 \(\frac{1}{1-x^2}\)。
- \(a_n=n+1\) 的生成函数:
很像导数欸,指数比系数小一,我们可以尝试对上面的重要性质求导,得到了:
发现导数就是我们要求的,接着推:
- \(a_n=\binom{n+m}{n}\) 的生成函数:
提取个负号出来:
展开组合数:
把 \(-1\) 乘进去,得:
将上面整理得:
长得很像二项式定理,把 \(\alpha=-(m+1),x=-x\) 代入,化简上式:
生成函数的运算
- 加法运算
设两个生成函数 \(f(x)=\sum_{i=0}a_ix^i\) 与 \(g(x)=\sum_{i=0}b_ix^i\),则它们加和为:
其实就是每一项的系数分别相加。
特别地,生成函数的加法运算也满足交换律,结合律。
- 乘法运算
设两个生成函数 \(f(x)=\sum_{i=0}a_ix^i\) 与 \(g(x)=\sum_{i=0}b_ix^i\),则它们的乘积为:
其中,系数 \(\sum_{j=0}^ia_jb_i-j\) 又称作数列 \(\left\{a_n\right\}\) 与 \(\left\{b_n\right\}\) 的卷积运算,记作:\(\left\{a_n\right\}*\left\{b_n\right\}\)。
这其实就是多项式乘积,本质都是系数卷积。
举个例子,\(f(x)=1+2x+3x^2\),\(g(x)=x^2+2x^3\),那么:
本质就是小学生都会的分配律。
特别地,生成函数的乘法运算满足交换律,结合律,分配律。
重要性质
把上面的写下来:
对于 \(|r|<1\),有
我们考虑对这个式子进行推广,如果左边分母指数不是一,而是 \(k\) 呢?
证明:
根据扩展二项式定理,对实数 \(\alpha\) 有:
其中 \(\dbinom{\alpha}{n}=\frac{\alpha(\alpha - 1)\cdots(\alpha-n+1)}{n!}\)。
令 \(\alpha=-k\),则:
计算组合数:
就先展开,提出符号,化简后式,接着推导,根据组合数对称性 \(\dbinom{n}{m}=\dbinom{n}{n-m}\):
接着,代回原式:
把 \(-1\) 和 \(x\) 合起来:
得证。
加深理解
再看一个应用的例子,比如说我要取 \(k\) 个物品,这些物品分为两类,\(A\) 类和 \(B\) 类,其中 \(A\) 类只能取 \(1\) 个或 \(2\) 个,而 \(B\) 类只能取 \(3\) 的倍数个。
令 \(a=\left\{1,1,1\right\}\),表示 \(A\) 类物品中可以选 \(0\) 个或 \(1\) 个或 \(2\) 个。
又令一个无限长的序列 \(a=\left\{1,0,0,1,0,0,1,0,0,1\cdots\right\}\),表示 \(B\) 类物品只能取 \(3\) 的倍数个。
现在把 \(a\) 的生成函数 \(u(x)=1+x+x^2\) 和 \(b\) 的生成函数 \(v(x)=1+x^3+x^6+x^9\cdots\) 乘起来。
得到一个新函数 \(f(x)=1+x+x^2+x^3+x^4+\cdots\),这个新函数,第 \(k\) 项的系数就是这道题的答案。
为什么第 \(k\) 项的系数就是答案?
生成函数乘法中,\(f(x)=a_0+a_1x+a_2x^2+a_3x^3\cdots\) 与 \(g(x)=a_0+b_1x+b_2x^2+b_3x^3\cdots\),两个生成函数的乘积为:
其中 \(c_k=a_0b_k+a_1b_k-1+\cdots+a_kb_0\)。
其实就是把上面的式子再写一次
\(a_i\) 就是 \(A\) 类食物总重量为 \(i\) 的方案数。
\(b_j\) 就是 \(B\) 类食物总重量为 \(j\) 的方案数。
当 \(i+j=k\) 时,\(a_i*b_j\) 表示 \(A\) 类选 \(i\) 个数,\(B\) 类选 \(j\) 个数的总方案数。
对于所有的 \(i+j=n\) 的情况求和,也就是 \(c_k\) 就是两类物品总个数为 \(k\) 的方案数。
例题
⻝物
依次写出各个食物对应的生成函数:
全部乘起来:
大力化简,得到:
我们只关心第 \(n\) 项的系数,因此使用出提取系数的记号:
这一步也就是把 \(x\) 消掉,不难发现这是上面推导的重要性质,因此讲 \(k=4\) 代入,得到了:
直接计算组合数即可。
Sweets
题意:\(n\) 种糖,每种糖有 \(m_i\) 个,求选出 \(a\) 到 \(b\) 颗糖果的方案数。
对于第 \(i\) 个糖果,吃糖果方案的生成函数为:
注意这里是不能直接化简的,因为这里糖果的个数是有限的。
将这些生成函数全部相乘,得到:
累乘前面这个就是重要性质,也就等于 \(\sum_{k=0}\dbinom{n + k - 1}{n - 1}x^k\)。
注意到 \(n\) 并不大,所以后面的式子直接暴力即可。
考虑对答案的贡献,答案为 \(x^a\sim x^b\) 对应的系数。
设后面的式子现在枚举到了 \(x^k\),则前面式子对答案的贡献为:
可以考虑用组合数加法公式进行化简 \(\left (\dbinom{n}{m}=\dbinom{n-1}{m}+\dbinom{n-1}{m-1}\right)\),变为了:
这就做完了,复杂度为 \(O(2^n)\),注意模数不是质数,直接暴力算组合数即可。
斐波那契数以及卡特兰数
斐波那契
8.6 update
我们先写出斐波那契数的生成函数:
左右同时乘个 \(x\):
上面减下面,得到了:
所以:
这式子看起来挺简洁的,我们称其为 “封闭形式”。
接下来把他因式分解:
再裂项:
这就成了两个等比数列求和公式乘个常数再相加的形式了!把两个等比数列还原成数列,得:
这就是斐波那契的通项公式。
卡特兰数
first part
首先写出卡特兰数的定义式:
考虑算他的生成函数:
先把 \(i\) 分为两部分,当 \(i\) 为 \(0\) 时函数值为 \(1\),然后再将卡特兰数拆开,得到:
发现其实 \(j\) 和 \(i\) 没什么关系,上界也不受限制,设 \(i'=i-j-1\),当 \(i\geq1\) 时 \(i'\geq0\)。
在提取后面的 \(x\),分离西格玛,那么:
发现后面的两个西格玛其实就是 \(f(x)\) 的形式,那么上面全部写下来就是:
这是一个一元二次方程,解得:
其中 \(\mp\) 和 \(\pm\),表示前一个取加号时后面取负号,反之同理。
现在有两个符号,去哪一个呢?
我们已知 \(h(0)=1\) 当 \(\lim _{x\rightarrow0}\) 时:
\(1-4x\rightarrow1\),所以原式等于:\(\frac{2}{1+\sqrt{1-4 x}}=\frac{2}{1+\sqrt{1}}=1=h(0)\);
还有另一种解释:当 \(x\rightarrow0\) 时系数就只剩下 \(h(0)\) 了,而且代入式子也是正确的。
符号是错误的,验证需要泰勒展开,这里不多说,再把分母有理化,化成了:
second part
我们把上面的根号展开:
把 \(i\) 等于 \(0\) 的情况分离出来,得出值为 \(1\),得到:
考虑来化简这个系数:
简单化简一下
把负号和 \(2\) 提取出来:
继续化简分子部分的奇数阶乘:
把 \((3)\) 代回 \((2)\) 代回原式,得到:
化简完系数,把 \((4)\) 代回 \((1)\):
再把这个根式代回原来的 \(f(x)\) 得到了:
这就是卡特兰数最后的式子了。

浙公网安备 33010602011771号