生成函数初步
我们定义序列 \(a\) 的普通型生成函数 \((\rm OGF)\) 为形式幂级数:
之所以要构造这样一个形式幂级数,是因为当 \(|x| < 1\) 的时候往往可以收敛成一个封闭形式便于运算。
下面是几个常见的 \(\rm OGF\) 极其封闭形式:
- \(F_1(x) = \sum\limits_{n \ge 0} x ^ n = 1 + x + x ^ 2 + x ^ 3 + \cdots = \dfrac{1}{1 - x}\)
可以发现这是一个公比为 \(x\) 的等比数列,对于 \(G(x) = \sum\limits_{i = 0} ^ n x_i = 1 + x + x ^ 2 + \cdots + x ^ n\)。
根据等比数列求和公式有 \(G(x) = \dfrac{1 - x ^ {n + 1}}{1 - x}\),因此可知 \(F_1(x) = \dfrac{1 - x ^ \infty}{1 - x}\)。
根据上面所提到的,\(|x| < 1\) 时 \(x ^ \infty\) 收敛于 \(0\),故 \(F_1(x) = \dfrac{1}{1 - x}\)
于是对于一般的公比为 \(ax\) 的等比数列构成的 \(\rm OGF\),有:
\(F_2(x) = \sum\limits_{n \ge 0} a ^ n x ^ n = \dfrac{1}{1 - ax}\)
于是得到第二种常用的 \(\rm OGF\):
-
\(F_2(x) = \sum\limits_{n \ge 0} ba ^ n x ^ n = b + bax + ba ^ 2x ^ 2 + \cdots = \dfrac{b}{1 - ax}\)
-
\(F_3(x) = \sum\limits_{n \ge 0} n x ^ n = 1 + 2x + 3x + \cdots = \dfrac{1}{(1 - x) ^ 2}\)
从形式上看可以发现 \(F_3(x) = F_1 ^ 2(x)\),事实上有:
- \(F_{4_m}(x) = \sum\limits_{n \ge 0} \binom{m}{n} x ^ n = (x + 1) ^ m\)
运用二项式定理不难证明。
- \(F_{5_m}(x) = \sum\limits_{n \ge 0} \binom{m + n}{n} x ^ n = \dfrac{1}{(1 - x) ^ {m + 1}}\)
注意到
即 \(F_{5_m}(x)\) 第 \(x ^ n\) 的系数为 \(F_{5_{m - 1}}\) 第 \(x_0 \sim x ^ n\) 系数之和,由 \(F_3(x)\) 的经验不难发现:
特别的,\(m = 0\) 时 \(F_{5_0}(x) = F_1(x)\),带入不难得证。
为了下面内容的推进,我们引入牛顿二项式定理:
实质上 \(\dbinom{n}{m} = \dfrac{n ^ {\underline m}}{m!}\) 可以看作是一种数值上的运算,那么我们不妨扩充组合数的定义域至复数域,有:
同时,借助其我们也能证明第五种常见 \(\rm OGF\):
下面简单介绍一些生成函数的基本应用。
求解递推数列通项公式
- 有限项数递推式
以斐波那契数列为例,令 \(a_0 = 0, a_1 = 1, a_n = a_{n - 1} + a_{n - 2}(n \ge 2)\)。
令其 \(\rm OGF\) 为 \(F(x) = \sum\limits_{n \ge 0} a_n x ^ n\)
根据斐波那契数列递推公式,可知:
解关于 \(F(x)\) 的方程组可得:
那么只需要求出 \(\dfrac{x}{1 - x - x ^ 2}\) 展开式在 \(x ^ n\) 处的系数即可。
介于我们只知道 \(\dfrac{b}{1 - ax}\) 的展开式,因此可以考虑将 \(F(x)\) 拆成两个形如 \(\dfrac{b}{1 - ax}\) 的和。
不妨设
待定系数解得:
利用常见 \(\rm OGF \ 2\) 即可计算出通项公式:
一般地,对于封闭形式为分数形式且分子分母均为两个多项式的情况,可用类似的方式求解通向公式。
- 另一类递推式
以卡特兰数为例。
令 \(a_0 = a_1 = 1, a_n = \sum\limits_{i = 0} ^ {n - 1} a_i \times a_{n - i - 1}(n \ge 2)\)
令其 \(\rm OGF\) 为 \(F(x) = \sum\limits_{n \ge 0} a ^ n x ^ n\)。
不难发现其递推式是一个卷积的形式,于是有:
解之得:
要保留哪个根呢?
求解上式在 \(x \to 0\) 时的极限可以发现,当 \(F(x) = \dfrac{1 + \sqrt{1 - 4x}}{2x}\) 时不收敛。
原因是:
则有:
故此时 \(x \to 0\) 时极限不存在。
因此可以得到:
将分子部分单独拿出来考虑,令 \(G(x) = 1 - \sqrt{1 - 4x} = 1 - (1 - 4x) ^ {\frac{1}{2}}\),使用牛顿二项式定理展开:
特别要注意的是 \(\dbinom{\frac{1}{2}}{0} = \frac{\frac{1}{2} ^ 0}{0!} = 1\) 但是用上面哪个式子是不正确的,因此需要特别考虑:
带回原式有:
因此可知 \(a_n = \dfrac{\dbinom{2n}{n}}{n + 1}\)
下面是几道基本例题。
A(参见 \(\rm OI-Wiki\))
求解一类计数问题。
不妨写出 \(1 \sim 8\) 的 \(\rm OGF\):
\(F_1(x) = 1 + x ^ 2 + x ^ 4 + \cdots = \sum\limits_{n \ge 0} x ^ {2n} = \dfrac{1}{1 - x ^ 2}\)
\(F_2(x) = 1 + x = \dfrac{1 - x ^ 2}{1 - x}\)
\(F_3(x) = 1 + x + x ^ 2 = \dfrac{1 - x ^ 3}{1 - x}\)
\(F_4(x) = x + x ^ 3 + \cdots = \sum\limits_{n \ge 0} x ^ {2n + 1} = \dfrac{x}{1 - x ^ 2}\)
\(F_5(x) = 1 + x ^ 4 + x ^ 8 + \cdots = \sum\limits_{n \ge 0} x ^ {4n} = \dfrac{1}{1 - x ^ 4}\)
\(F_6(x) = 1 + x + x ^ 2 + x ^ 3 = \dfrac{1 - x ^ 4}{1 - x}\)
\(F_7(x) = F_2(x)\)
\(F_8(x) = 1 + x ^ 3 + x ^ 6 + \cdots = \sum\limits_{n \ge 0} x ^ {3n} = \dfrac{1}{1 - x ^ 3}\)
将这八个 \(\rm OGF\) 相乘即可得到总的 \(\rm OGF\):
根据常用 \(\rm OGF \ 5\) 可知:
B
可知第 \(i\) 种糖果的 \(\rm OGF\) 为 \(F_i(x) = 1 + x + \cdots x ^ {m_i} = \dfrac{1 - x ^ {m_i + 1}}{1 - x}\)
将 \(n\) 种糖果的 \(\rm OGF\) 相乘可得总的 \(\rm OGF\):
介于要统计某个区间内的系数,首先差分转化为统计一个前缀的系数和。
由之前的经验不难发现只需要让 \(F(x)\) 卷上 \(F_1(x)\) 即可只统计单点的系数了。
于是只需要考虑:
在 \(x ^ L\) 处的系数即可。
将分子分母单独考虑:
注意到 \(n\) 很小,只需暴力展开前面的多项式再乘上对应贡献即可。可以使用 \(dfs\) 来实现暴力展开。
需要注意的是,模数为 \(2004\) 不为质数,可能不存在逆元,因此计算组合数 \(\dbinom{n}{m}\) 的时候先将分子对 \(m!P\) 取模,最后除以 \(m!\) 即可。(易证得此方法正确)
C
不难发现对于峰顶左右两边是互不影响的两个子问题,于是可以考虑枚举峰顶大小和峰顶位置,分别计算左右两边的方案。
但如果出现多个位置均为峰顶的情况,这样会记重,于是只能枚举峰顶的两端。
其次来考虑一下左右两边的子问题:在 \([1, m]\) 中选择 \(n\) 个数形成不降序列的方案数。
直接计数是不好计算的,可以考虑统计差值的方案数,即 \(x_1 + x_2 + \cdots x_n = L(x_i \ge 0)\) 的方案数。
因为 \(x_1, x_n\) 强制大于 \(0\) 于是先将这部分减去即可:
那么最终的答案就为:
需要注意的是 \(0 - 2 = -1 < 0\) 但 \(i = 1\) 的情况显然只有全 \(1\) 一种,特殊考虑即可,下面只考虑 \(i > 2\) 的情况。
首先平移值域将常数项去掉:
不难发现,后面两个组合数分别为 \(F_{5_i}(x)\) 在 \(x ^ j\) 处的系数和 \(F_{5_{i + 1}}(x)\) 在 \(x ^ {n - j - 1}\) 处的系数。
并且,整个后面可以明显发现为一个卷积的形式,因此可知后面一整块式子相当于为 \(\rm OGF\):
在 \(x ^ {n - 1}\) 的系数,即为:\(\dbinom{2i + n + 1}{n - 1}\)
因此最终的答案为: