什么是生成函数:
对于序列$a_i$,定义它的生成函数为:
$$G(x) = \sum_{i=0}^{+\infty} a_ix^i$$
一个生成函数与一个序列是唯一对应的。
我们可以利用生成函数的性质解决一些组合问题。
一些重要的式子:
先写几个常用的生成函数(下式中$x∈(0,1)$):
- $$\frac{1-x^n}{1-x} = \sum_{i=0}^{n-1} x^i$$
- $$\frac{1}{1-x} = \sum_{i=0}^{+\infty} x^i$$
- $$\frac{1}{1-x^k} = \sum_{i=0}^{+\infty} x^{ki}$$
- $$\frac{1}{(1-x)^k} = \sum_{i=0}^{+\infty} C_{i+k-1}^{k-1} x^i$$
- $$\frac{\phi x^k}{1 - \lambda x} = \sum_{i=0}^{+\infty} \phi * \lambda^{i-k} x^i$$
现在我们来证明上面的式子:
- 由等比数列求和公式可知成立
- 考虑$1$式中的$x$趋近于无穷时,此时$x^n$趋近于$0$,这样就证明了$2$式
- 同上,将$2$式右边的$x^i$换成$(x^k)^i$即可
- $\frac{1}{(1-x)^k}$相当于是$k$个$\frac{1}{1-x}$乘起来,其中第$i$项的系数就是从$k$个$\sum_{i=0}^{+\infty} x^i$中各选一项,乘起来恰好为$x_i$的方案数。相当于是$k$个盒子放$i$个球,允许空盒的方案数。利用插板法可以得知答案为$C_{i+k-1}^{k-1}$
- emmmmm好像不大会
例题:
- 给定递推式$a_n = 2a_{n-1} + 1$,求通项公式($a_0 = 0$)
设这个数列的生成函数$G(x) = \sum_{i=0}^{+\infty} a_ix^i$
$G(x) = (2a_0 + 1)x + (2a_1 + 1)x^2 + ...$
$=(2a_0x + 2a_1x^2 + ...) + (x + x^2 + ...)$
$=2x(a_0 + a_1x + ...) + (x + x^2 + ...)$
$=2xG(x) + \frac{1}{1-x} - 1$
即:$G(x) = \frac{x}{(1-x)(1-2x)} = \frac{1}{1-2x} - \frac{1}{1-x}$
得到每一项系数(通项公式)为:$a_n = 2^n - 1$
- 拯救世界
我们把题目中的十条限制用生成函数的方法写出来:
$\frac{1}{1-x^6}$,$\frac{1-x^10}{1-x}$
$\frac{1-x^6}{1-x}$,$\frac{1}{1-x^4}$
$\frac{1-x^8}{1-x}$,$\frac{1}{1-x^2}$
$\frac{1-x^2}{1-x}$,$\frac{1}{1-x^8}$
$\frac{1}{1-x^{10}}$,$\frac{1-x^4}{1-x}$
把这十个式子乘起来,得到$\frac{1}{(1-x)^5}$
那么答案(第$n$项的系数)就是$C_{n+4}^{4} = \frac{(n+1)(n+2)(n+3)(n+4)}{24}$
- 求斐波那契数列的通项公式($a_0 = 0, a_1 = a_2 = 1, a_n = a_{n - 1} + a_{n - 2}$)
先设生成函数$G(x) = \sum_{i=0}^{+\infty} = a_i x^i$
由递推公式可以得到(这里可能要多想一想):
$$G(x) - x^2 - x = x(G(x) - x) + x^2G(x) = \frac{x}{1-x-x^2}$$
我们要想办法把这个式子化成上面的那种特殊生成函数
$$\frac{x}{1-x-x^2} = \frac{x}{(1 - \frac{1 - \sqrt{5}}{2}x)(1 - \frac{1 + \sqrt{5}}{2}x)}$$
为了方便书写,我们设$\alpha = \frac{1 + \sqrt{5}}{2}, \beta = \frac{1 - \sqrt{5}}{2}$,我们再裂项一下,得到:
$$\frac{1}{\sqrt{5}} (\frac{1}{1 - \alpha x} - \frac{1}{1 - \beta x})$$
于是得到通项公式$a_n = \frac{\alpha^n - \beta^n}{\sqrt{5}}$
即:$$a_n = \frac{\frac{1 + \sqrt{5}}{2} - \frac{1 - \sqrt{5}}{2}}{\sqrt{5}}$$
- 求$n$位十进制数中出现偶数个$5$的数的个数
先考虑递推公式,假设我们已经知道了$n-1$位时的答案$a_{n-1}$,然后我们考虑在最后一位添加的数字
设出现奇数个$5$的数的个数为$b_n$,那么容易得到:$a_n = 9a_{n-1} + b_{n-1}$
又因为:$a_n + b_n = 9 * 10^{n-1}$
所以有:$a_n = 8 * a_{n-1} + 9 * 10^{n-2}$
设$G(x)$为生成函数,根据递推关系,不难得到:
$$G(x) - 8x = 8xG(x) + 9x^2(\frac{1}{1-10x})$$
整理得:
$$G(x) = \frac{x(8 - 71x)}{(1-8x)(1-10x)}$$
化简一下可以得到:
$$G(x) = \frac{1}{2}(\frac{7x}{1 - 8x} + \frac{9x}{1 - 10x})$$
于是得到通项公式:
$$a_n = \frac{7 * 8^{n-1} + 9 * 10^{n-1}}{2}$$
总结:
我们可以总结一下用生成函数由递推公式推得通项公式的步骤:
- 设数列生成函数为$G(x) = \sum_{i=0}^{+\infty} a_ix^i$
- 由递推式推得$G(x)$的数值表达式
- 将$G(x)$的数值表达式转化成上面几种特殊形式的式子
- 将$x^n$的系数提出,即可得到$a_n$的通项公式
其实上述过程也可以逆转过来,通过数列的通项公式(生成函数)求出递推公式,感兴趣的话还可以看这篇文章:一类通过生成函数求线性递推式的方法