生成函数简介
定义
序列 \(A\) 的生成函数(又称母函数,generating function),是一种形式幂级数,其每一项的系数都可以提供关于 \(A\) 的信息。
形式幂是指,无论函数的自变量的取值是多少,都不影响原序列的信息。
常用的有普通生成函数和指数生成函数。
生成函数经常被用于处理组合/排列问题。
普通生成函数
开放形式
我们看这样一个模型:
有三堆颜色不同的球,分别为 \(A,B,C\)。其中,\(A\) 有 3 个,\(B\) 有 4 个,\(C\) 有 2 个。问从中取出 4 个球进行组合的方案数是多少?
我们定义多项式 \(A(x)=1+x+x^2\),系数表示 1 种方案,指数表示取几个。\(B,C\) 同理。
那么最后的答案即为 \(A*B*C(x)\) 的第 4 项上的系数。因为第 4 项的系数表示取 4 个的方案数。
可以乘起来的原因是多项式乘法的本质是乘法分配律后同阶相加。
我们称形如 \(F(x)=\sum_{i=0}^n a_ix^i\) 为序列 \([a_1,a_2,\dots,a_n]\) 的普通生成函数。
再来一个例子:
若有面值为 \(1,2,3,4\) 的钱币各 1 枚,请问一共能凑出多少种面值?
\((1+x)(1+x^2)(1+x^3)(1+x^4)\) 的项数即为答案。如果至少去一个就去掉常数项。
封闭形式
我们在实际运用中,直接做形式幂级数的形式十分不方便。我们可不可以找到一个简洁的形式使其脱离多项式,尤其是项数 \(\rightarrow \infty\) 的时候。
我们拿 \([1,1,1,\dots]\) 的生成函数 \(F(x)=\sum_{i\geqslant0}x^i\) 来举例:
或者直接使用等比数列求和公式可以得到:
当 \(n \rightarrow \infty\) 时,\(x^n \rightarrow 0\)。
亦或者等比数列 \([1,a,a^2,a^3,\dots]\) 的生成函数 \(F(x)=\sum_{i\geqslant0}a^ix^i\):
这里列举一些:
我们一般先将初始的几个函数转成封闭形式,乘起来后再转回开放形式得到答案。
指数生成函数
普通生成函数可以用来解决组合问题,而指数生成函数可以用来解决排列问题。
多重集排列数
多重集是指包含重复元素的广义集合。我们设 \(S={a_1n_1,a_2n_2,\dots,a_nn_n}\),则 \(S\) 的全排列个数为 \(\frac{n!}{a_1!a_2!\dots a_n!}\)。