生成函数的简单应用

什么是生成函数:

对于序列$a_i$,定义它的生成函数为:

$$G(x) = \sum_{i=0}^{+\infty} a_ix^i$$

一个生成函数与一个序列是唯一对应的。

我们可以利用生成函数的性质解决一些组合问题。


一些重要的式子:

先写几个常用的生成函数(下式中$x∈(0,1)$):

  1. $$\frac{1-x^n}{1-x} = \sum_{i=0}^{n-1} x^i$$
  2. $$\frac{1}{1-x} = \sum_{i=0}^{+\infty} x^i$$
  3. $$\frac{1}{1-x^k} = \sum_{i=0}^{+\infty} x^{ki}$$
  4. $$\frac{1}{(1-x)^k} = \sum_{i=0}^{+\infty} C_{i+k-1}^{k-1} x^i$$
  5. $$\frac{\phi x^k}{1 - \lambda x} = \sum_{i=0}^{+\infty} \phi * \lambda^{i-k} x^i$$

现在我们来证明上面的式子:

  1. 由等比数列求和公式可知成立
  2. 考虑$1$式中的$x$趋近于无穷时,此时$x^n$趋近于$0$,这样就证明了$2$式
  3. 同上,将$2$式右边的$x^i$换成$(x^k)^i$即可
  4. $\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}$
  5. 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$的通项公式

 其实上述过程也可以逆转过来,通过数列的通项公式(生成函数)求出递推公式,感兴趣的话还可以看这篇文章:一类通过生成函数求线性递推式的方法

posted @ 2019-03-07 21:41  Aegir  阅读(1179)  评论(0编辑  收藏  举报