Note - 生成函数
生成函数,是一个节约大脑资源的推组合的工具。
普通生成函数
据说这个比较常见。下记 \(\langle a_n \rangle\) 为序列 \(a\) 的普通生成函数。
定义
定义序列 \(a\) 的普通生成函数为:
注意这里 \(x\) 是一个形参,我们不需要也不关心它的值。
运算
显然地:
其中 \(k\) 是常数。
手摸一下仔细想想可以得到:
你可以用 FFT 实现这个东西。
封闭形式
封闭形式定义为一个由有限个初等函数和有限次的四则运算和幂运算复合成的表达式 \(F(x)\),使 \(\langle a_n \rangle = F(x)\)。
有失严谨地,\(\langle a_n \rangle\) 的值,或者化简以后的形式。
举个例子,我们要求 \(F(x) = \langle 1, 1, 0, 0, \cdots, 0 \rangle\) 的封闭形式。由生成函数定义,我们知道 \(F(x) = 1 + x\)。但是序列有限的情况毕竟还是少数。
再举个例子,我们要求 \(F(x) = \langle 1, 1, 1, 1, \cdots, 1 \rangle\)。我们注意到,\(F(x) = xF(x) +1\),于是:
原式的运算对封闭形式同样适用,且很多情况下封闭形式的计算难度远小于原式。所以建议大家多练习推封闭形式,也多练习展开封闭形式。
习题:
- \(\langle 1, 0, 0, 0, 0, \cdots \rangle\)
- \(\langle 0, 1, 1, 1, 1, \cdots \rangle\)
- \(\langle 1, 0, 1, 0, 1, \cdots \rangle\)
- \(\langle m^n \rangle\)
- \(\langle 1, 2, 3, 4, 5, \cdots \rangle\)
- \(\langle {m \choose n} \rangle\)
- \(\langle {m+n \choose n} \rangle\)
答案
- \(F(x) = 1\)
- \(F(x) = xF(x)+x \implies F(x) = \frac x {1-x}\)
- \(F(x) = x^2F(x) + 1 \implies F(x) = \frac 1 {1-x^2}\)
- \(F(x) = mxF(x)+1 \implies F(x) = \frac 1 {1-mx}\)
- \(F(x) = xF(x)+\sum_{i=0}^\infin x^i \implies (1-x)F(x) = \frac 1 {(1-x)} \implies F(x) = \frac 1 {(1-x)^2}\)
- 由二项式定理,\(F(x) = (1+x)^m\)
- 先给出结论:\(F(x) = \frac 1 {(1-x)^{m+1}}\)。
当 \(m = 0\) 时,序列退化成全 \(1\),显然成立。
当 \(m > 0\) 时,归纳假设对 \(m-1\) 成立,那么:(第三步到第四步本质上是把两边的和为 \(n\) 的项写在一起)
应用
推通项公式
举个例子:定义 \(f_0 = 0, f_1 = 1, f_n = f_{n-1}+f_{n-2}\)。求它的通项公式。其实就是 Fibonacci 数列
我们先试着求一下它的生成函数。
求通项有一个常见的套路,就是按分母的次数待定系数求解。比如说对于 \(\frac {x}{1-x-x^2}\) 我们可以设 \(\frac{A}{1-ax}+\frac{B}{1-bx}\)。当然如果分母比较容易因式分解那么也可以拆掉,如果因式有高次那么把低次到高次都设一遍。比如说 \(1-x-3x^2-5x^3-2x^4 = (1+x)^3(1-2x)\),那么就可以设 \(\frac{x+1}{1-x-3x^2-5x^3-2x^4} = \frac{A}{1+x}+\frac B {(1+x)^2}+\frac C{(1+x)^3}+\frac D{1-2x}\)。
于是我们设:
于是,通分得到:
所以:
其中一个解为:
于是大力代入:
于是我们翻找习题答案注意到 \(\sum_{n=0}^{\infin} m^nx^n = \frac 1 {1-mx}\)。
于是进行展开:
所以 \(f_n = \frac 1 {\sqrt 5} \left( \left( \frac{1+\sqrt 5}2 \right)^n + \left( \frac{1-\sqrt 5}2 \right)^n \right)\)。
简单地进行卷积
给出一道例题(P10780 BZOJ3028 食物 ):
明明这次又要出去旅游了,和上次不同的是,他这次要去宇宙探险!我们暂且不讨论他有多么 NC,他又幻想了他应该带一些什么东西。理所当然的,你当然要帮他计算携带 \(n\) 件物品的方案数。
他这次又准备带一些受欢迎的食物,如:蜜桃多啦,鸡块啦,承德汉堡等等。
当然,他又有一些稀奇古怪的限制:
每种食物的限制如下:
- 承德汉堡:偶数个;
- 可乐:\(0\) 个或 \(1\) 个;
- 鸡腿:\(0\) 个,\(1\) 个或 \(2\) 个;
- 蜜桃多:奇数个;
- 鸡块:\(4\) 的倍数个;
- 包子:\(0\) 个,\(1\) 个,\(2\) 个或 \(3\) 个;
- 土豆片炒肉:不超过一个;
- 面包:\(3\) 的倍数个;
注意,这里我们懒得考虑明明对于带的食物该怎么搭配着吃,也认为每种食物都是以『个』为单位(反正是幻想嘛),只要总数加起来是 \(n\) 就算一种方案。因此,对于给出的 \(n\),你需要计算出方案数,并对 \(10007\) 取模。
对于所有数据,\(1\leq n\leq 10^{500}\);
读者可以试着自己推一下式子。
答案
得到:
把这八个东西乘起来可以得到 \(F(x) = \frac 1 {(1-x)^4}\),展开得到 \(\sum_{n=0}^{\infin} {n \choose 3}\)。
指数生成函数
学到以后再写吧。

浙公网安备 33010602011771号