前言

之前一直无法理解生成函数的这些概念,最近算是入了门,下面我记录下我自己理解这些式子的方式。

我们使用生成函数的最终目的是计数,所以多项式的项次数超过某个值对于我们来说就没用了,于是我们可以在(modxn)\pmod{x^n} 的意义下理解逆元、复合等概念。

常生成函数

一个数列 {an}\{a_n\} 对应的常生成函数为 A(x)=n0anxnA(x)=\sum_{n\ge 0} a_nx^n

有两种物体,取 ii 个第一种物体的方案数为 aia_i,取 jj 个第二种物体的方案数为 bjb_j,那么取 kk 个物体的方案数 ck=i=0kaibkic_k=\sum_{i=0}^k a_ib_{k-i},这也称为这两个序列的卷积

我们观察两个常生成函数的积,有:

[xk]A(x)B(x)=i=0kaibki\left[x^k\right]A(x)B(x)=\sum_{i=0}^k a_ib_{k-i}

于是 A(x)B(x)A(x)B(x) 就是 ckc_k 的常生成函数。

指数生成函数

一个数列 {an}\{a_n\} 对应的指数生成函数为 A(x)=n0anxnn!A(x)=\sum_{n\ge 0} a_n\cfrac{x^n}{n!}

有两种物体,取 ii 个第一种物体的方案数为 aia_i,取 jj 个第二种物体的方案数为 bjb_j,那么取 kk 个物体排成一列的方案数 ck=i=0k(ki)aibkic_k=\sum_{i=0}^k\binom{k}{i}a_ib_{k-i}

我们观察两个指数生成函数的积,有:

[xk]A(x)B(x)=i=0kaii!bki(ki)!=i=0k(ki)aibki1k!\begin{aligned} \left[x^k\right]A(x)B(x)&=\sum_{i=0}^k \frac{a_i}{i!}\frac{b_{k-i}}{(k-i)!}\\ &=\sum_{i=0}^{k}\binom{k}{i}a_ib_{k-i}\frac{1}{k!} \end{aligned}

于是 A(x)B(x)A(x)B(x) 就是 ckc_k 的指数生成函数。

定义 exp(ax)i=0n1aixii!(modxn)\exp(ax)\equiv \sum_{i=0}^{n-1}\cfrac{a^ix^i}{i!}\pmod{x^n},下面我们证明 exp(ax)exp(bx)exp((a+b)x)(modxn)\exp(ax)\exp(bx)\equiv \exp((a+b)x)\pmod {x^n}

exp(ax)exp(bx)k=0n1(i=0kaibkii!(ki)!)xkk=0n1(i=0k(ki)aibki)xkk!k=0n1(a+b)kxkk!(modxn)\begin{aligned} \exp(ax)\exp(bx)&\equiv \sum_{k=0}^{n-1}\left(\sum_{i=0}^k\frac{a^ib^{k-i}}{i!(k-i)!}\right) x^k\\ &\equiv \sum_{k=0}^{n-1}\left(\sum_{i=0}^k\binom{k}{i}a^ib^{k-i}\right) \frac{x^k}{k!}\\ &\equiv \sum_{k=0}^{n-1}\frac{(a+b)^kx^k}{k!}\pmod{x^n} \end{aligned}

逆元

对于 A(x)A(x),满足 A(x)B(x)1(modxn)A(x)B(x)\equiv 1\pmod{x^n} 的多项式称为 A(x)A(x) 的逆元。

我们可以假设 A(x)=i=0n1aixiA(x)=\sum_{i=0}^{n-1} a_ix^iB(x)=i=0n1bixiB(x)=\sum_{i=0}^{n-1}b_ix^i,然后相乘,可以得到:

A(x)B(x)k=0n1(i=0kaibki)xk(modxn)A(x)B(x)\equiv\sum_{k=0}^{n-1}\left(\sum_{i=0}^k a_ib_{k-i}\right) x^k\pmod{x^n}

现在就可以列方程求解了:

{a0b0=1a0b1+a1b0=0i=0n1aibn1i=0\begin{cases} a_0b_0&=1\\ a_0b_1+a_1b_0&=0\\ \vdots\\ \sum_{i=0}^{n-1} a_ib_{n-1-i}&=0 \end{cases}

所以 b0=a01b_0=a_0^{-1},并且递推能唯一地解出每一个 bib_i 的值,所以逆元是唯一的。

下面给出常见的逆元:

  • A(x)=i=0n1xiA(x)=\sum_{i=0}^{n-1} x^iB(x)=1xB(x)=1-x

    a={1,1,1,,1}a=\{1,1,1,\dots,1\}b={1,1,0,,0}b=\{1,-1,0,\dots,0\},容易验证这满足条件。

  • A(x)=i=0n1kixiA(x)=\sum_{i=0}^{n-1} k^ix^iB(x)=1kxB(x)=1-kx

    a={k0,k1,k2,kn1}a=\{k^0,k^1,k^2\dots,k^{n-1}\}b={1,k}b=\{1,-k\},容易验证这满足条件。

  • A(x)=i=0n1(k1+ik1)xiA(x)=\sum_{i=0}^{n-1}\binom{k-1+i}{k-1}x^iB(x)=(1x)kB(x)=(1-x)^k

    这里用了前面的结论 (1x)1i=0n1xi(modxn)(1-x)^{-1}\equiv \sum_{i=0}^{n-1}x_i\pmod{x^n},考虑:

    (1x)k×((1x)1)k1(modxn)(1-x)^k \times ((1-x)^{-1})^k\equiv 1\pmod{x^n}

    于是就有:

    ((1x)k)1(i=0n1xi)k(modxn)j=0n1cjxj(modxn)\begin{aligned} ((1-x)^k)^{-1}&\equiv \left(\sum_{i=0}^{n-1} x^i\right)^k\pmod{x^n}\\ &\equiv\sum_{j=0}^{n-1} c_j x^j\pmod{x^n} \end{aligned}

    考虑每一个 cjc_j 的意义,是在 kk 个非负数 i1,i2,,iki_1,i_2,\dots,i_k 满足 i1+i2++ik=ji_1+i_2+\cdots+i_k=j 的解的个数,那么显然有 cj=(j+k1k1)c_j=\binom{j+k-1}{k-1}

卡特兰数

n+1n+1 个数相乘 x0x1xnx_0x_1\dots x_n,求它们结合顺序的方案数。如 n=3n=3 时,x0(x1(x2x3)),x0((x1x2)x3),(x0x1)(x2x3),((x0x1)x2)x3,(x0(x1x2))x3x_0(x_1(x_2x_3)),x_0((x_1x_2)x_3),(x_0x_1)(x_2x_3),((x_0x_1)x_2)x_3,(x_0(x_1x_2))x_3

首先,c0=1,c1=1c_0=1,c_1=1

对于 cnc_n,考虑最后一步运算,一定是左右两个组内都乘完之后进行的,那么我们可以枚举这两个组的分界线的位置,就得到了公式 cn=c0cn1+c1cn2++cn1c0c_n=c_0c_{n-1}+c_1c_{n-2}+\cdots+c_{n-1}c_0

考虑这个序列的常生成函数 F(x)i=0n1cixi(modxn)F(x)\equiv \sum_{i=0}^{n-1}c_ix^{i}\pmod{x^n},我们能得到什么信息?

根据这个递推式,不难看出这是一个卷积的形式,那么我们给 F(x)F(x) 平方一下,可以推出:

F2(x)k=0n1(i=0kcicki)xkk=0n1ck+1xk(modxn)\begin{aligned} F^2(x)&\equiv \sum_{k=0}^{n-1}\left(\sum_{i=0}^k c_ic_{k-i}\right)x^k\\ &\equiv\sum_{k=0}^{n-1} c_{k+1}x^k\pmod{x^n} \end{aligned}

我们给两边同乘一个 xx,有:

xF2(x)k=1n1ckxkF(x)1(modxn)\begin{aligned} xF^2(x)&\equiv \sum_{k=1}^{n-1} c_k x^k\\ &\equiv F(x)-1\pmod{x^n} \end{aligned}

所以我们需要解方程 xF2(x)F(x)+10(modxn)xF^2(x)-F(x)+1\equiv 0\pmod{x^n}

按照传统配方的思路,可以得到 (xF(x)12)2x+14(modxn+1)\left(xF(x)-\cfrac{1}{2}\right)^2\equiv -x+\cfrac{1}{4}\pmod{x^{n+1}}

对于所有函数 G(x)G(x) 满足 G2(x)x+14(modxn+1)G^2(x)\equiv -x+\cfrac{1}{4}\pmod{x^{n+1}},我们有 xF(x)G(x)+12(modxn+1)xF(x)\equiv G(x)+\cfrac{1}{2}\pmod{x^{n+1}}

G(x)G(x) 对应的序列为 {g0,g1,,gn}\{g_0,g_1,\dots,g_n\},我们有:

{g02=14g0g1+g1g0=1i=0ngigni=0\begin{cases} g_0^2&=\cfrac{1}{4}\\ g_0g_1+g_1g_0&=-1\\ \vdots\\ \sum_{i=0}^{n}g_ig_{n-i}&=0 \end{cases}

我们希望 g0=12g_0=-\cfrac{1}{2},否则 xF(x)G(x)+12(modxn+1)xF(x)\equiv G(x)+\cfrac{1}{2}\pmod{x^{n+1}} 是无解的。

于是 gig_i 的每一个值都可以唯一地确定下来了,并且有 F(x)F(x) 的序列 {f0,f1,,fn1}\{f_0,f_1,\dots,f_{n-1}\} 满足 fi=gi+1f_i=g_{i+1}

根据广义二项式定理,有:

(x+14)12i=0n(12)ii!(x)i(14)12i(modxn+1)\left(-x+\frac{1}{4}\right)^{\frac{1}{2}}\equiv \sum_{i=0}^n \frac{(\frac{1}{2})^{\underline{i}}}{i!} (-x)^i(\frac{1}{4})^{\frac{1}{2}-i}\pmod{x^{n+1}}

本文不讨论为什么可以把高数的东西拿过来用,只证明这个式子是对的。

x+14k=0n(i=0k(12i)(12ki))(1)k(14)1kxkk=0n(1k)(1)k(14)1kxk14x(modxn+1)\begin{aligned} -x+\frac{1}{4}&\equiv \sum_{k=0}^n\left(\sum_{i=0}^k \binom{\frac{1}{2}}{i}\binom{\frac{1}{2}}{k-i}\right) (-1)^k(\frac{1}{4})^{1-k}x^k\\ &\equiv\sum_{k=0}^n\binom{1}{k} (-1)^k(\frac{1}{4})^{1-k}x^k\\ &\equiv \frac{1}{4}-x\pmod{x^{n+1}} \end{aligned}

这里用到了范德蒙德卷积,它对于上指标是实数的情况仍然是成立的。

于是我们就得到了 gig_i 的解:

gi=(12)ii!(1)i(14)12i=12(12)ii!(4)i\begin{aligned} g_i&=-\frac{(\frac{1}{2})^{\underline{i}}}{i!}(-1)^i(\frac{1}{4})^{\frac{1}{2}-i}\\ &=-\frac{1}{2} \frac{(\frac{1}{2})^{\underline{i}}}{i!} (-4)^i \end{aligned}

i2i\ge 2 时,我们可以看到 (12)i=12(12)(12i+1)(\frac{1}{2})^{\underline{i}}=\frac{1}{2}(-\frac{1}{2})\cdots(\frac{1}{2}-i+1)i1i-1 个负项,加上式子最前面的符号,可以把 (4)i(-4)^i 的负号全部抵消掉,并且有:

gi=(12)i14i1i!=(1×3××(2i3))2i1i!=(1×3××(2i3))(1×2××(i1))2i1i!(i1)!=(1×3××(2i3))(2×4××(2i2))i!(i1)!=1i(2i2)!(i1)!(i1)!=1i(2i2i1)\begin{aligned} g_i&=\frac{(\frac{1}{2})^{\overline{i-1}}4^{i-1}}{i!}\\ &=\frac{(1\times 3\times \cdots \times (2i-3)) 2^{i-1}}{i!}\\ &=\frac{(1\times 3\times \cdots \times (2i-3))(1\times 2\times\cdots\times (i-1)) 2^{i-1}}{i!(i-1)!}\\ &=\frac{(1\times 3\times \cdots \times (2i-3))(2\times 4\times\cdots\times (2i-2))}{i!(i-1)!}\\ &=\frac{1}{i}\frac{(2i-2)!}{(i-1)!(i-1)!}\\ &=\frac{1}{i}\binom{2i-2}{i-1} \end{aligned}

于是 fi=gi+1=1i+1(2ii)f_i=g_{i+1}=\frac{1}{i+1}\binom{2i}{i},可以验证 i=0i=0 时是成立的。

说明

虽然上面我们都是在模 xnx^n 的意义下讨论的,实际上做题的时候可以认为 nn 足够大,把生成函数写成 F(x)=i0fixiF(x)=\sum_{i\ge 0} f_i x^i 的形式即可。

[CF451E] Devu and Flowers

对于每一种花,它的常生成函数是 Fi(x)=(1xfi+1)(1x)1F_i(x)=(1-x^{f_i+1})(1-x)^{-1},于是答案的生成函数 F(x)=(1x)ni=1n(1xfi+1)F(x)=(1-x)^{-n}\prod_{i=1}^n (1-x^{f_i+1})

A(x)=(1x)nA(x)=(1-x)^{-n}B(x)=i=1n(1xfi+1)B(x)=\prod_{i=1}^n(1-x^{f_i+1}),由于 n20n\le 20,所以可以暴力算出 B(x)B(x),二进制枚举每一个括号给出的贡献即可,这最多会生成 2n2^n 项,计算的复杂度是 O(n2n)O(n2^n)

我们又知道 A(x)A(x) 的每一项是 (n1+in1)\binom{n-1+i}{n-1},所以枚举 B(x)B(x) 的每一项,O(n)O(n) 暴力计算组合数即可,复杂度 O(n2n)O(n2^n)

AC Code

[CEOI2004] Sweets

这和上一个题目几乎一样,只不过对于答案的生成函数 F(x)F(x),需要求 i=ab[xi]F(x)\sum_{i=a}^b[x^i]F(x)

考虑 G(x)=i0gixiG(x)=\sum_{i\ge 0} g_i x^i 其中 gi=j=0ifjg_i=\sum_{j=0}^i f_j

h={1,1,1,}h=\{1,1,1,\dots\}G(x)=F(x)H(x)G(x)=F(x)H(x),所以我们给 F(x)F(x) 再乘一个 (1x)1(1-x)^{-1} 即可。

这里有一个别的问题,我们怎么求 (n+in)mod2004\binom{n+i}{n}\bmod 2004

写一下它的式子:

(n+in)=(n+i)nn!\binom{n+i}{n}=\frac{(n+i)^{\underline{n}}}{n!}

由于组合数一定是整数,所以 n!(n+1)nn!\mid (n+1)^{\underline{n}},先算 r=(n+i)nmod(2004n!)r=(n+i)^{\underline{n}}\bmod (2004n!),我们有:

(n+i)n=q(2004n!)+r(n+i)^{\underline{n}}=q(2004n!)+r

其中 n!rn!\mid r,于是:

(n+i)nn!=q(2004!)+rn!\frac{(n+i)^{\underline{n}}}{n!}=q(2004!)+\frac{r}{n!}

AC Code

[POJ3734] Blocks

对于 a={1,0,1,0,}a=\{1,0,1,0,\dots\} 的指数生成函数,为 F1(x)=1+x22!+x44!+=exp(x)+exp(x)2F_1(x)=1+\cfrac{x^2}{2!}+\cfrac{x^4}{4!}+\cdots=\cfrac{\exp(x)+\exp(-x)}{2};对于奇偶都行的为 F2(x)=exp(x)F_2(x)=\exp(x),所以答案的指数生成函数就是:

F(x)=(F1(x)F2(x))2=(exp(x)+exp(x)2exp(x))2=exp(4x)+2exp(2x)+14\begin{aligned} F(x)&=\left(F_1(x)F_2(x)\right)^2\\ &=\left(\frac{\exp(x)+\exp(-x)}{2} \exp(x)\right)^2\\ &=\frac{\exp(4x)+2\exp(2x)+1}{4} \end{aligned}

由于我们要求 n![xn]F(x)n![x^n]F(x),其中 n1n\ge 1,所以可以不用管那个常数项。

继续计算:

n![xn]F(x)=n!4(4nn!+22nn!)=4n+2n+14\begin{aligned} n![x^n]F(x)&=\frac{n!}{4}\left(\frac{4^n}{n!}+2\frac{2^n}{n!}\right)\\ &=\frac{4^{n}+2^{n+1}}{4} \end{aligned}

AC Code

[CF891E] Lust

观察操作前后的序列,我们会发现,操作前是 a1a2ax1axax+1ana_1a_2\dots a_{x-1}a_xa_{x+1}\dots a_n,操作后是 a1a2axana1a2ax1ax+1ana_1a_2\dots a_x\dots a_n-a_1a_2\dots a_{x-1}a_{x+1}\dots a_n,于是 resres 就加它们两个之差。

我们假设 kk 次操作后 aiaibia_i\gets a_i-b_i,其中 bi0b_i\ge 0,那么就有期望 EE 为:

E=b1++bn=k(i=1naii=1n(aibi))(kb1,b2,,bn)nk=k!nk(b1++bn=k(i=1naibi!)b1++bn=k(i=1naibibi!))\begin{aligned} E&=\frac{\sum_{b_1+\cdots+b_n=k}\left(\prod_{i=1}^n a_i-\prod_{i=1}^n (a_i-b_i)\right)\binom{k}{b_1,b_2,\dots,b_n}}{n^k}\\ &=\frac{k!}{n^k}\left(\sum_{b_1+\cdots+b_n=k}\left(\prod_{i=1}^n\frac{a_i}{b_i!}\right)-\sum_{b_1+\cdots+b_n=k}\left(\prod_{i=1}^n\frac{a_i-b_i}{b_i!}\right)\right) \end{aligned}

不难看出 b1++bn=ki=1nbi!\sum_{b_1+\dots+b_n=k}\prod_{i=1}^n \cfrac{*}{b_i!} 是一个卷积的结构,手玩一下可以推出左边是 aiexp(x)a_i\exp(x) 乘起来,右边是 (aix)exp(x)(a_i-x)\exp(x) 乘起来,这都是可以 O(n2)O(n^2)计算的,最后取 xkx^k 的系数。

形式化地,我们写作:

E=[xk]k!nk(i=1naiexp(x)+i=1n(aix)exp(x))=[xk]k!nkexp(nx)(i=1nai+i=1n(aix))=[xk]k!nkexp(nx)F(x)=k!nki=1n[xi]F(x)[xki]exp(nx)=k!nki=1n[xi]F(x)nki(ki)!=1nki=1n[xi]F(x)nkik!(ki)!\begin{aligned} E&=\left[x^k\right]\frac{k!}{n^k}\left(\prod_{i=1}^n a_i\exp(x)+\prod_{i=1}^n(a_i-x)\exp(x)\right)\\ &=\left[x^k\right]\frac{k!}{n^k}\exp(nx)\left(\prod_{i=1}^n a_i+\prod_{i=1}^n(a_i-x)\right)\\ &=\left[x^k\right]\frac{k!}{n^k}\exp(nx)F(x)\\ &=\frac{k!}{n^k}\sum_{i=1}^n[x^i]F(x)[x^{k-i}]\exp(nx)\\ &=\frac{k!}{n^k}\sum_{i=1}^n[x^i]F(x)\frac{n^{k-i}}{(k-i)!}\\ &=\frac{1}{n^k}\sum_{i=1}^n[x^i]F(x) n^{k-i}\frac{k!}{(k-i)!}\\ \end{aligned}

我们可以 O(n)O(n) 算出 k!(ki)!\cfrac{k!}{(k-i)!},由于 F(x)F(x) 的次数最高就是 nn,于是我们的 ii 最大到 nn 即可,这样的复杂度是 O(n2)O(n^2) 的。

AC Code