普通生成函数

生成函数即母函数(generating function),是一种解决计数问题的强有力的工具。它能将一个序列的信息映射到一个形式幂级数 \(f(x)\) 上,其每一项的系数可以提供关于这个序列的信息。

生成函数一般分为普通型生成函数指数型生成函数两种。

本文先介绍普通生成函数相关内容。

tips:本文求和符号上界没有的话默认为 \(\infty\)

普通生成函数

定义

对于一个序列 \(a\),定义 \(a\) 的普通生成函数(Ordinary generating function,简称 OGF)为:

\[f(x)=a_0+a_1x+a_2x^2+a_3x^3+...+a_nx^n+... \]

长得很像多项式(只不过无上限),又记作:

\[f(x)=\sum_{i=0}a_ix^i \]

其中,这个 \(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\) 项的系数,记作:

\[[x^i]f(x)=a_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\)

知识引入(二项式定理)

这是一般的二项式定理:

\[(x+y)^n=\sum_{i=1}^{n} C_i^nx^iy^{n-i} \]

定义组合数:\(\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!\) 是阶乘。

这样就可以扩展二项式定义为:

\[(1+x)^{\alpha}=\sum_{k \geq 0}\binom{\alpha}{k} x^{k} \]

\(\alpha\) 是任意实数。

一些生成函数(及其推导)

  • \(a_n=1\) 的生成函数:

\[f(x)=\sum_{n \geq 0}x^n=\frac{1}{1-x} \]

这是怎么算的呢?首先,根据等比数列求和公式,我们知道:

\[1+x+x^2+x^3+\cdots x^n=\frac{x^{n+1}-1}{x-1} \]

\(n\) 趋近于无穷大时,因为 \(x\in(-1,1)\),所以 \(x^{n+1}\) 趋近于 \(0\)

所以说:

\[1+x+x^2+x^3+\cdots x^n=\frac{-1}{x-1}=\frac{1}{1-x} \]

这是一个重要性质,对于 \(|r|<1\),有

\[\boxed{\sum_{n \geq 0}r^n=\frac{1}{1-r}} \]

注意,这里的 \(n\) 是无穷大的,所以可以这么写,但题目一般都是有限的,所以实际算的时候不能直接代入,只能老老实实算。

  • \(a_n=2^n\) 的生成函数是:

\[f(x)=\sum_{n \geq 0}2^n\times x^n=\sum_{n \geq 0} (2x)^n \]

这种形式就与上面的通项非常相似,\(r=2x\)

\(|r=2x|<1\) 时,也就是 \(|x| < \frac12\) 时,级数收敛,所以:

\[f(x)=\sum_{n \geq 0} (2x)^n=\frac{1}{1-2x} \]

  • \(a_n=\binom{m}{n}\) 的生成函数:

\[f(x)=\sum_{n\geq 0}\binom{m}{n}\times x^n=(1+x)^m \]

这其实就是二项式定理,很好看出来吧。

  • \(a_n=[n \bmod 2 = 0]\) 的生成函数:

\[f(x)=\sum_{n \bmod 2 = 0}x^n=x^0+x^2+x^4+x^6\cdots \]

这其实就是公比为 \(x^2\) 的等比数列,代入求和公式就是 \(\frac{1}{1-x^2}\)

  • \(a_n=n+1\) 的生成函数:

\[f(x)=\sum_{n\geq 0}(n+1)x^n=1+2x+3x^2+4x^3\cdots \]

很像导数欸,指数比系数小一,我们可以尝试对上面的重要性质求导,得到了:

\[g(x)=\sum_{n\geq 0}x^n=\frac{1}{1-x}=1+x+x^2+x^3+x^4+\cdots \\ g'(x)=1+2x+3x^2+4x^3+\cdots \]

发现导数就是我们要求的,接着推:

\[f(x)=g'(x)=(\frac{1}{1-x})'=\frac{1}{(1-x)^2} \]

  • \(a_n=\binom{n+m}{n}\) 的生成函数:

\[f(x)=\sum_{n\geq 0}\binom{n+m}{n}\times x^n \]

提取个负号出来:

\[f(x)=\sum_{n\geq 0}(-1)^n\binom{n+m}{n}\times (-x)^n \]

展开组合数:

\[f(x)=\sum_{n\geq 0}\frac{(-1)^n(m+1)(m+2)\cdots(m+n)}{n!}\times (-x)^n \]

\(-1\) 乘进去,得:

\[f(x)=\sum_{n\geq 0}\frac{(-(m+1))(-(m+1)+1)\cdots(-(m+1)-n+1)}{n!}\times (-x)^n \]

将上面整理得:

\[f(x)=\sum_{n\geq 0}\binom{-(m+1)}{n}\times (-x)^n \]

长得很像二项式定理,把 \(\alpha=-(m+1),x=-x\) 代入,化简上式:

\[f(x)=(1-x)^{-(m+1)}=\frac{1}{(1-x)^{m+1}} \]

生成函数的运算

  • 加法运算

设两个生成函数 \(f(x)=\sum_{i=0}a_ix^i\)\(g(x)=\sum_{i=0}b_ix^i\),则它们加和为:

\[f(x)+g(x)=\sum_{i=0} (a_i+b_i )x^i \]

其实就是每一项的系数分别相加。

特别地,生成函数的加法运算也满足交换律结合律

  • 乘法运算

设两个生成函数 \(f(x)=\sum_{i=0}a_ix^i\)\(g(x)=\sum_{i=0}b_ix^i\),则它们的乘积为:

\[f(x)g(x)=\sum_{i=0}\left(\sum_{j=0}^ia_jb_i-j\right)x^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\),那么:

\[f(x)g(x)=(1+2x+3x^2)(x^2+2x^3)=x^2+2x^3+2x^3+4x^4+3x^4+6x^5\\=x^2+4x^3+7x^4+6x^5 \]

本质就是小学生都会的分配律。

特别地,生成函数的乘法运算满足交换律结合律分配律

重要性质

把上面的写下来:

对于 \(|r|<1\),有

\[\boxed{\frac{1}{1-r}=\sum_{n \geq 0}r^n} \]

我们考虑对这个式子进行推广,如果左边分母指数不是一,而是 \(k\) 呢?

\[\frac{1}{(1 - x)^k}=\sum_{n = 0}\dbinom{n + k - 1}{k - 1}x^n(|x|<1) \]

证明:

根据扩展二项式定理,对实数 \(\alpha\) 有:

\[(1+x)^{\alpha}=\sum_{n=0}\dbinom{\alpha}{n}x^n \]

其中 \(\dbinom{\alpha}{n}=\frac{\alpha(\alpha - 1)\cdots(\alpha-n+1)}{n!}\)

\(\alpha=-k\),则:

\[(1-x)^{-k}=\sum_{n=0}\dbinom{-k}{n}(-x)^n \]

计算组合数:

\[\dbinom{-k}{n}=\frac{(-k)(-k-1)\cdots(-k-n+1)}{n!}=(-1)^n\frac{k(k+1)\cdots(k+n-1)}{n!}=(-1)^n\dbinom{k+n-1}{n} \]

就先展开,提出符号,化简后式,接着推导,根据组合数对称性 \(\dbinom{n}{m}=\dbinom{n}{n-m}\)

\[(-1)^n\dbinom{k + n - 1}{n}=(-1)^n\dbinom{k + n - 1}{k - 1} \]

接着,代回原式:

\[(1-x)^{-k}=\sum_{n=0}(-1)^n\dbinom{k + n - 1}{k - 1}(-x)^n \]

\(-1\)\(x\) 合起来:

\[(1-x)^{-k}=\frac{1}{(1-x)^k}=\sum_{n=0}\dbinom{k + n - 1}{k - 1}x^n \]

得证。

加深理解

再看一个应用的例子,比如说我要取 \(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\),两个生成函数的乘积为:

\[f(x)g(x)=c_0+c_1x+c_2x^2+c_3x^3 \]

其中 \(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\) 的方案数。

例题

⻝物

依次写出各个食物对应的生成函数:

\[\frac{1}{1-x^2},1+x,1+x+x^2,\frac{x}{1-x^2},\frac{1}{1-x^4},1+x+x^2+x^3,1+x,\frac{1}{1-x^3} \]

全部乘起来:

\[\frac{x(1+x)^2(1+x+x^2)(1+x+x^2+x^3)}{(1-x^2)^2(1-x^3)(1-x^4)} \]

大力化简,得到:

\[ans=\frac{x}{(1-x)^4} \]

我们只关心第 \(n\) 项的系数,因此使用出提取系数的记号:

\[ans=[x^n]\frac{x}{(1-x)^4}=x[x^n-1]\frac{1}{(1-x)^4} \]

这一步也就是把 \(x\) 消掉,不难发现这是上面推导的重要性质,因此讲 \(k=4\) 代入,得到了:

\[ans=x[x^n-1]\frac{1}{(1-x)^4}=\dbinom{n-1+4-1}{4-1}=\dbinom{n+2}{3} \]

直接计算组合数即可。

Sweets

题意:\(n\) 种糖,每种糖有 \(m_i\) 个,求选出 \(a\)\(b\) 颗糖果的方案数。

对于第 \(i\) 个糖果,吃糖果方案的生成函数为:

\[f(i)=\sum_{i=0}^{m_i}x^i=\frac{1-x^{m_i+1}}{1-x} \]

注意这里是不能直接化简的,因为这里糖果的个数是有限的。

将这些生成函数全部相乘,得到:

\[\frac{\prod_{i=1}^n(1-x^{m_i+1})}{(1-x)^n}=(1-x)^{-n}\prod_{i=1}^n(1-x^{m_i+1}) \]

累乘前面这个就是重要性质,也就等于 \(\sum_{k=0}\dbinom{n + k - 1}{n - 1}x^k\)

注意到 \(n\) 并不大,所以后面的式子直接暴力即可。

考虑对答案的贡献,答案为 \(x^a\sim x^b\) 对应的系数。

设后面的式子现在枚举到了 \(x^k\),则前面式子对答案的贡献为:

\[\sum_{i=a-k}^{b-k}\dbinom{n+i-1}{i} \]

可以考虑用组合数加法公式进行化简 \(\left (\dbinom{n}{m}=\dbinom{n-1}{m}+\dbinom{n-1}{m-1}\right)\),变为了:

\[\dbinom{n+b-k}{b-k}-\dbinom{n+a-k-1}{a-k-1}\ \]

这就做完了,复杂度为 \(O(2^n)\),注意模数不是质数,直接暴力算组合数即可。

斐波那契数以及卡特兰数

斐波那契

8.6 update

我们先写出斐波那契数的生成函数:

\[f(x)=x+x^2+2x^3+3x^4+5x^5+8x^6+\cdots \]

左右同时乘个 \(x\)

\[x \times f(x) = x^2+x^3+2x^4+3x^5+5x^6+8x^7+\cdots \]

上面减下面,得到了:

\[f(x)-xf(x)=x+x^3+x^4+2x^5+3x^6+5x^7+\cdots=x+x^2 \times f(x) \]

所以:

\[f(x)=\frac{x}{1-x-x^2} \]

这式子看起来挺简洁的,我们称其为 “封闭形式”

接下来把他因式分解:

\[f(x)=\frac{x}{1-x-x^2}=\frac{x}{(1-\frac{1+\sqrt{5}}{2}x)(1-\frac{1-\sqrt{5}}{2}x)} \]

再裂项:

\[f(x)=\frac{x}{(1-\frac{1+\sqrt{5}}{2}x)(1-\frac{1-\sqrt{5}}{2}x)}=-\frac{1}{5}\frac{1}{(1-\frac{1-\sqrt{5}}{2}x)}+\frac{1}{5}\frac{1}{(1-\frac{1+\sqrt{5}}{2}x)} \]

这就成了两个等比数列求和公式乘个常数再相加的形式了!把两个等比数列还原成数列,得:

\[fib_n=-\frac{1}{5}\left(\frac{1-\sqrt{5}}{2}\right)^n+\frac{1}{5}\left(\frac{1+\sqrt{5}}{2}\right)^n \]

这就是斐波那契的通项公式。

卡特兰数

first part

首先写出卡特兰数的定义式:

\[h(i)=\sum_{j=0}^{i-1}h(j)h(i-j-1) \]

考虑算他的生成函数:

\[f(x)=\sum_{i \geq 0}h(i)x^{i} \]

先把 \(i\) 分为两部分,当 \(i\)\(0\) 时函数值为 \(1\),然后再将卡特兰数拆开,得到:

\[f(x)=1+\sum_{i\geq 1}\sum_{j=0}^{i-1}h(j)x^{j}h(i-j-1)x^{i-j-1}x \]

发现其实 \(j\)\(i\) 没什么关系,上界也不受限制,设 \(i'=i-j-1\),当 \(i\geq1\)\(i'\geq0\)

在提取后面的 \(x\),分离西格玛,那么:

\[f(x)=1+x\sum_{j\geq0}h(j)x^{j}\sum_{i'\geq0}h(i')x^{i'} \]

发现后面的两个西格玛其实就是 \(f(x)\) 的形式,那么上面全部写下来就是:

\[\begin{aligned} f(x)&=\sum_{i\geq0}h(i)x^{i}\\ &=1+\sum_{i\geq1}\sum_{j=0}^{i-1}h(j)x^{j}h(i-j-1)x^{i-j-1} x\\ &=1+x\sum_{j\geq0}h(j)x^{j}\sum_{i\geq0}h(i)x^{i} \\ &=1+xf^{2}(x) \end{aligned} \]

这是一个一元二次方程,解得:

\[f(x)=\frac{1\pm\sqrt{1-4x}}{2x}=\frac{2}{1\mp\sqrt{1-4x}} \]

其中 \(\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)\) 了,而且代入式子也是正确的。

符号是错误的,验证需要泰勒展开,这里不多说,再把分母有理化,化成了:

\[f(x)=\frac{1-\sqrt{1-4 x}}{2 x} \]

second part

我们把上面的根号展开:

\[\begin{equation} (1-4 x)^{\frac{1}{2}}=\sum_{i\geq0}\binom{\frac{1}{2}}{i}(-4 x)^{i} \end{equation} \]

\(i\) 等于 \(0\) 的情况分离出来,得出值为 \(1\),得到:

\[=1+\sum_{i\geq1}\binom{\frac{1}{2}}{i}(-4 x)^{i} \]

考虑来化简这个系数:

\[\binom{\frac{1}{2}}{i}=\frac{\left(\frac{1}{2} \right)\left( \frac{1}{2} - 1 \right)\left(\frac{1}{2} - 2\right) \cdots \left(\frac{1}{2}-(i-1) \right)}{i!} \]

简单化简一下

\[\binom{\frac{1}{2}}{i}=\frac{\frac{1}{2} \left(\frac{1}{2} - 1 \right) \left( \frac{1}{2}-2\right)\cdots\left(\frac{1}{2}-(i-1) \right)}{i!} \]

把负号和 \(2\) 提取出来:

\[\begin{equation} \binom{\frac{1}{2}}{i}=\frac{(-1)^{i-1}\cdot1\cdot3\cdot 5\cdots (2i-3)}{2^{i-1}\cdot i!} \end{equation} \]

继续化简分子部分的奇数阶乘:

\[\begin{equation} 1\cdot3\cdot 5\cdots(2i-3)=\frac{(2i-2)!}{2^{i-1} \cdot (i-1)!} \end{equation} \]

\((3)\) 代回 \((2)\) 代回原式,得到:

\[\begin{equation} \binom{\frac{1}{2}}{i}=\frac{(-1)^{i-1}}{2^{2i-1}} \cdot \frac{(2i-2)!}{(i-1)!\cdot i!} \end{equation} \]

化简完系数,把 \((4)\) 代回 \((1)\)

\[\begin{aligned} (1-4 x)^{\frac{1}{2}}&=1+\sum_{i\geq1}\binom{\frac{1}{2}}{i}(-4 x)^{i} \\ & =1-\sum_{i \geq 1} \frac{2(2 i-2)!}{(i-1)!i!} x^{i} \end{aligned} \]

再把这个根式代回原来的 \(f(x)\) 得到了:

\[\begin{aligned} f(x) &=\sum_{i\geq1}\frac{(2 i-2)!}{(i-1)!i!} x^{i-1} \\ &=\sum_{i\geq0}\frac{(2i)!}{i!(i+1)!} x^{i} \\ &=\sum_{i\geq0}\frac{1}{i+1}\binom{2 i}{i} x^{i} \end{aligned} \]

这就是卡特兰数最后的式子了。

\[\boxed{f(x)=\sum_{i\geq0}\frac{1}{i+1}\binom{2i}{i} x^{i}} \]

posted @ 2025-08-03 16:27  二项式kimi  阅读(65)  评论(3)    收藏  举报