生成函数(1):基础

牛顿二项式定理

熟悉的二项式系数 \(n\choose m\) 很多时候无法满足我们日益增长的需求,现在我们来扩充一下 \(n\) 的定义域,由正整数域扩充到 \(r\choose m\)。同时将 \(m\) 扩充到整数域。

我们定义 \({r\choose m} = \begin{cases}0 & (m < 0) \\ \dfrac{r(r - 1)(r - 2)\dots(r - m + 1)}{m!} & (m \ge 0)\end{cases}\)。也就是 \(r\) 下降幂次除以 \(m!\)

那么存在 \((x + y) ^ n = \sum\limits_{i \ge 0}{n \choose i}x^iy^{n - i}\)

它可以用来展开式子。

形式幂级数

对于一个数列(可以是无穷的)\(a_i\),定义其形式幂级数为

\(f(x) = \sum\limits_{n = 0}a_nx^n\)

这里面 \(x\) 什么含义都没有。正如(抱歉,忘了数学家名字了 qaq)所说,生成函数只不过是挂数字的晾衣架而已。

EI 老师云,生成函数是数列在多项式上的投影。

运算

加减乘

\(f(x) = \sum\limits_{n = 0}a_n x^n, g(x) = \sum\limits_{n = 0}b_nx^n\)

\(f(x) + g(x) = \sum\limits_{n = 0}(a_n + b_n)x^n\)\(f(x)g(x) = \sum\limits_{k = 0}(\sum\limits_{i+j=k}a_ib_j)x^k\)

位移

将整个数列右移 \(w\) 位,那么

\(f(x) = x^w\sum\limits_{i = 0}a_ix^i = \sum\limits_{i = w}a_{i - w}x^i\)

左移 \(w\) 位,可能会将有些元素移除数列中,需要注意

\(f(x) = x^{-w}\sum\limits_{i = w}a_ix^i = \sum\limits_{i = 0}a_{i+w}x^i\)

封闭形式

很多时候形式幂级数是不封闭的形式,不利于我们使用,所以我们需要使用封闭形式来对此进行简化。

等比数列

对于数列 \(a_i = cp^i\),生成函数

\(A(x) = \sum\limits_{i = 0}cp^ix^i\)。模仿一下经典的错位相减可以得到

\(pxA(x) + c = A(x)\) 最后得到 \(A(x) = \dfrac{c}{1 - px}\)

这个结果看上去非常的怪异。这么一长串的合式怎么会变成这样?这是形式幂级数,因此这里的 \(x\) 只是一个“形式”而已,不用对此较真。这就和 \(i\) 一样。\(i\) 是什么数?先别管 qwq

小小的变式:特别的,对于 \(A(x) = \sum\limits_{i = m}cp^ix^i\),怎么处理?

还是很显然的伐,\(A(x) = p^mx^mc\sum\limits_{i = 0}p^ix^i = \dfrac{cx^mp^m}{1 - px}\)

线性齐次递推

我们以斐波那契数列为例,对于涉及更多项的齐次递推本质相同。

\(a_i = \begin{cases}0&i = 0\\1&i =1\\ a_{i - 1} + a_{i - 2} & i > 1\end{cases}\),生成函数记作 \(f(x)\)

考虑通过位移将齐次递推中的和项给拼起来,最后形成一个 \(f(x)\) 的方程,解出来 \(f(x)\) 即可。

因为 \(0, 1\) 都是给定的,后面才是递推的,所以我们这样考虑

\(f(x) - 0x^0 - 1x^1 = \sum\limits_{i = 2}(a_{i - 1} + a_{i - 2})x^i = x\sum\limits_{i = 1}a_{i}x^i + x^2\sum\limits_{i = 0}a_ix^i = x[f(x) - 0x^0] + x^2f(x)\)

于是得到 \(f(x) - x = xf(x) + x^2f(x)\),最终应有 \(f(x) = \dfrac{x}{1 - x - x^2}\)

对于一般的线性齐次递推也完全可以利用上面的思路。这是相当具有一般性的,但是写起来实在太麻烦了。

一些例子

部分和

如果我们知道 \(a\) 的生成函数了,那么 \(s_i = \sum\limits_{j = 0}^i a_j\) 呢?

\(g(x) = (a_0) + (a_0 + a_1)x + (a_0 + a_1 + a_2)x^2 + \dots \\ = f(x) + xf(x) + x^2f(x) + \dots \\ = (1 + x + x^2 + x^3 + \dots)f(x) = \dfrac{f(x)}{1 - x}\)。部分和的生成函数是 \(\dfrac{1}{1 - x}f(x)\)

Catalan 数

定义 \(c_i = \begin{cases}1& i = 0 \\ \sum\limits_{j = 0}^{i - 1} c_jc_{i - j - 1} & i > 0\end{cases}\),我们要求出 \(c_i\) 的生成函数,封闭形式,还有通项。

令其生成函数为 \(f(x)\),观察到下面的形式像一个卷积,于是发现 对于 \([x^n]f^2(x) = \sum\limits_{i = 0}^n c_ic_{n - i} = c_{n+1}\),因此应该有 \(xf^2(x) +1 = f(x),xf^2(x) - f(x) + 1 = 0\),然后得到 \(f(x) = \dfrac{1 \pm {\sqrt{1 - 4x}}}{2x}\)。神秘的事情就出在这里了,如果取 \(+\) 号,那么就可能出现 \(x = 0, f(0) = 2/0\),这是没办法接受的,但是如果取 \(-\) 号,那么 \(x = 0, f(0) = 0/0\) 可以洛(我不会洛必达法则 QAQ 不过我们可以简单的这么认为吗?\(0/0\) 是可以接受的)。所以我们取 \(-\)\(f(x) = \dfrac{1 - \sqrt{1 - 4x}}{2x}\)

接下来的问题就是把它展开。主要的问题就在于对 \(g(x) = \sqrt{1 - 4x} = (1 - 4x)^{1/2}\) 的展开。利用牛顿二项式定理,

\[(1 - 4x)^{1/2} = \sum\limits_{n = 0}(-4x)^n{\frac{1}{2}\choose n} \\ = \sum\limits_{n = 0}\dfrac{(-2)\times 2\times 6\times \dots \times(4n - 6)}{n!}x^n \\= \sum\limits_{n = 0}\dfrac{2^n(-1)\times 1 \times 3 \times \dots \times (2n - 3)}{n!} x^n \]

到这一步我们发现问题变成了如何对一串前缀奇数进行求积。偶数求乘积很容易,所以我们把它化为偶数

\(s = \prod\limits_{i = 0}^n (2i + 1), \dfrac{(2n + 1)!}{s} = \prod\limits_{i = 1}^n 2i = 2^nn!\),故 \(s = \dfrac{(2n + 1)}{2^n n!}\)。上面的讨论中实际上求的是 \((n - 2)\) 的情况,所以 \(n = 0, n = 1\) 的两个系数我们单独算一下,分别是 \([x^0]g(x) = 1, [x^1]g(x) = -2\).

接下来 \([x^n]g(x) = 2^n(-1)\dfrac{(2n - 3)!}{2^{n - 2}(n - 2)!n!}x^n \\ = \dfrac{(-4)(2n - 3)!}{(n - 2)!n!}x^n\)

\(g(x) = 1 - 2x + \sum\limits_{n = 2}\dfrac{(-4)(2n - 3)!}{(n - 2)!n!}x^n\)

于是 $$f(x) = \dfrac{1 - g(x)}{2x} \ = \dfrac{2x + \sum\limits_{n = 2}\dfrac{4(2n - 3)!}{(n - 2)!n!}x^n}{2x} \ = 1 + \sum\limits_{n = 2}\dfrac{2(2n - 3)!}{(n - 2)!n!}x^{{n - 1}} \ = 1 + \sum\limits_{n = 1}\dfrac{2(2n - 1)!}{(n - 1)!(n + 1)!}x^n \ = 1 + \sum\limits_{n = 1}\dfrac{(2n)!}{n!(n + 1)!}x^n \ = 1 + \sum\limits_{n = 1}\dfrac{{2n \choose n}}{n + 1}x^n$$。

于是得到 \(c_n = \dfrac{{2n\choose n}}{n + 1}\)

*五边形数(without proof)

我们令 \(p_n\)\(n\) 的正整数拆分数,即有多少种的数列 \(a\) 使得

  1. \(a_1 + a_2 + \dots + a_k = n\)
  2. \(a_1 \ge a_2 \ge \dots \ge a_k\ge 1\)

注意到这个形式很像一个卷积,我们考虑选择数字 \(c\) 进入拼凑,那么就是乘上一个 \(1 + x^c + x^{2c} + \dots = \dfrac{1}{1 - x^c}\),于是 \(p\) 的生成函数就是

\(f(x) = \prod\limits_{c = 1}\dfrac{1}{1 - x ^c} = \dfrac{1}{\prod\limits_{c = 1}(1 - x^c)}\)

我们考虑 \(g(x) = \prod\limits_{c = 1}(1 - x^c)\),通过暴力 dp 打表找规律我们发现一个很惊奇地事情

  1. 每一项的系数都是 \(\{0, 1, -1\}\)
  2. \(0\) 位置的系数是 \(1, -1, -1, 1, 1, -1, -1, \dots\)
  3. \(0\) 位置的次数是 \(0, 1, 2, 5, 7, 12, 15, 22, 26, \dots\)
    • 我们考虑瞪眼法,首先这个单调递增,很好,其次我们猜测它是多项式。差分一下。
    • \(1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6\dots\)
    • 发现一阶差分的规律
      • \(n\) 为奇数,\(c_i = (n + 1)/2\)
      • \(n\) 为偶数,\(c_i = n + 1\)
    • 前缀和还原回去
      • \(n\) 为偶数,那么 \(d_n = \dfrac{n(3n + 2)}{8}\).
      • \(n\) 为奇数,那么 \(d_n = \dfrac{(3n + 1)(n + 1)}{8}\)
      • 如果直接按照差分数组推导,那么太困难了,但是我们知道,显然这是一个关于 \(\lfloor n / 2\rfloor\) 的二次函数,直接待定系数即可。
      • 于是得到 \(g(x) = 1 + \prod\limits_{n = 1}(-1)^n x^{\frac{n(3n \pm 1)}{2}}\)
      • 这就是正五边形定理了。
  4. 运用正五边形定理和多项式求逆可以 \(O(n\log_2 n)\) 求出正整数划分数,从而愉快的 AC P6189
  5. 咋严格证明啊。我不会呢。标记

EGF

对于数列 \(\{a\}\),定义其 egf 为 \(f(x) = \sum\limits_{n = 0}\dfrac{a_i}{i!}x^i\)

EGF 让我们很方便做这种神秘的卷积:\(h_n = \sum\limits_{m = 0}{n\choose m}f_mg_{n - m}\),接下来就应该出现 \(\dfrac{h_n}{n!} = \sum\limits_{m = 0}\dfrac{f_m}{m!} \times \dfrac{g_{n - m}}{(n - m)!}\)

这下就是 \(f, g\) 的 egf 的卷积得到了 \(h\) egf 的卷积了,非常好。

我们观察一下它的组合意义。令 \(f_i, g_i\) 分别为 A 类选了 \(i\) 个的方案数,B 类选了 \(i\) 个的方案数。那么 \(h_n\) 就是把 \(n\) 个 A 类和 B 类事物分别按照原来的顺序乖乖站好,但是 A 类 B 类交错的方案数。A 类事物和 B 类是不一样的。而 ogf 的卷积则是一样的。这是它们的区别。

封闭形式

牢牢记住

\(e^x = \sum\limits_{n = 0}\dfrac{x^n}{n!}\)

\(\ln(1 - x) = -\sum\limits_{n = 0}\dfrac{x^n}{n}\)

等比数列

  • \(<1, 1, 1, 1, 1, \dots>\),生成函数 \(e^x\)
  • \(<1, p, p^2, p^3, \dots>\),生成函数 \(e^{px}\)

交错

  • \(<1, -1, 1, -1, \dots>\)
    • \(e^{-x} = \sum\limits_{n = 0}\dfrac{(-1)^nx^n}{n!}\)
  • \(<1, 0, 1, 0, 1, \dots >\),生成函数 \(\dfrac{e^x + e^{-x}}{2}\)
  • \(<0, 1, 0, 1,0, \dots>\),生成函数 \(\dfrac{e^x - e^{-x}}{2}\)

下降幂

\(n\)\(m\) 次下降幂就是 \(A_{n}^m\)

  • 对于序列 \(<A_{m}^0, A_{m}^1, A_{m}^2, \dots>\),egf 为

    \(f(x) = \sum\limits_{n = 0}\dfrac{A_{m}^n}{m!}x^n \\ = \sum\limits_{n = 0}{m\choose n}x^n \\ = (1 + x)^m\)

    非常的漂亮啊

\(e^{F(x)}\) 的组合意义

高贵伟大光荣正确惊天大秘密!

\(F(x)\) 是一个 egf,我们记它原序列为 \(<f_0, f_1, \dots, f_n>\)

然后我们看看 \(e^F(x)\) 是啥,泰勒展开一下

\([x^m]e^{F(x)} = [x^m](\sum\limits_{n = 0} \dfrac{F^n(x)}{n!}) \\ = \sum\limits_{n = 0}\sum\limits_{a_1 + a_2 + \dots + a_n = m}\prod\limits_{i = 1}^n \dfrac{f_{a_i}}{a_i!}\)

因为这是 egf,原序列是要乘上一个 \(m!\)

\(m![x^m] = \sum\limits_{n = 0}\sum\limits_{a_1 + a_2 + \dots + a_n = m}\prod\limits_{i = 1}^n \dfrac{f_{a_i}}{a_i!}m!\)

\(\dfrac{m!}{a_1!a_2!\dots a_n!}\) 实际上的意思是 \(m!\) 内多重集的排列数!

我们考虑它的组合意义:有 \(n\) 个有标号元素,\(f_m\) 代表 \(m\) 个元素(这个时候元素之间是等价的)放到一个合法集合里面的方案数,那么 \(e^{F(x)}\) 的第 \(m\) 项系数则是代表把 \(m\) 个元素划分成若干个集合的方案数。\(m!\) 内多重集的组合数相当于对 \(m\) 内的元素进行一个划分。要注意这样一点,\(f_m\) 里面可以看作是不带编号的,但是 \(e^{f(x)}\) 是带有编号的,这是要区分的

posted @ 2025-08-29 23:48  CatFromMars  阅读(25)  评论(1)    收藏  举报