这是一篇即将咕咕很久的学习笔记。

定义f(x)=a0+a1x+a2x2+a3x3...f(x)=a_0+a_1x+a_2x^2+a_3x^3...,f(x)f(x)就是序列a0,a1,a2...ana_0,a_1,a_2...a_n的生成函数

01背包问题

给你w1,w2,w3,...wnw_1,w_2,w_3,...w_n,每个数只有取和不取的两种状态,求凑成WW的种类数。

构造f(x)=∏i=1n(x0+xwi)f(x)=\prod_{i=1}^n (x^0+x^{w_i}),于是答案就是xWx^W的系数。

注意以下证明过程中$$省略。

完全背包问题

给你w1,w2,w3,...,wnw_1,w_2,w_3,...,w_n,每个数可以取任意多种,求凑成WW的种类数。

构造f(x)=∏i=1n(∑j=0xwi×j)f(x)=\prod_{i=1}^n (\sum _{j=0} x^{w_i\times j}),答案就是xWx^W的系数。

∑j=0xwi×j\sum _{j=0} x^{w_i \times j}是无穷的,如何算出?

令p=xiwp=x^w_i,那么有∑j=0xwi×j=∑j=0pj\sum _{j=0} x^{w_i \times j}=\sum _{j=0} p^j。

注意到∑j=0pj=1−p∞1−p\sum _{j=0} p^j=\frac{1-p^\infty}{1-p},当x∈(−1,1)x \in (-1,1)时,p∈(−1,1)p\in (-1,1),所以p→0p^ \to 0,于是原式就是11−p\frac{1}{1-p},即11−xiw\frac{1}{1-x_i^w}。

两种生成函数

前面介绍了第一种生成函数:∑j=0xj=11−x(x∈(−1,1))\sum _{j=0} ^{} x^j =\frac{1}{1-x}(x \in (-1,1))

现在介绍第二种中的一个特殊情况:∑j=0(j+1)×xj=?\sum _{j=0}^{} (j+1) \times x^j=?

我们把两个∑j=0xj\sum _{j=0} ^{} x^j相乘,凑成jj的有(0,j),(1,j−1)...(j,0)(0,j),(1,j-1)...(j,0)这么多种,共j+1j+1种选法。

于是∑j=0(j+1)×xj=1(x−1)2\sum _{j=0} (j+1) \times x^j=\frac{1}{(x-1)^2}

推广一下:

1(x−1)k\frac{1}{(x-1)^k}是什么?

问题转化为凑出kk个数,使他们的和为jj的方案数。

插板法即可,答案为Cj+k−1k−1C_{j+k-1}^{k-1}

于是1(x−1)k=∑j=0Cj+k−1k−1xj\frac{1}{(x-1)^k}=\sum_{j=0} C_{j+k-1}^{k-1} x^j

注意到Cj+k−1k−1=Cj+k−1jC_{j+k-1}^{k-1}=C_{j+k-1}^j,这个形式在下面的广义二项式定理里面会用到。

于是我们总结出以下规律:

11−xk=∑j=0xjk\frac{1}{1-x^k}=\sum _{j=0} x^{jk}

1(1−x)k=∑j=0Cj+k−1k−1xj\frac{1}{(1-x)^k}=\sum_{j=0} C_{j+k-1}^{k-1} x^j

还有一个有限项数的求和公式:

1−xk+11−x=∑j=0kxk\frac{1-x^{k+1}}{1-x}=\sum _{j=0}^k x^k

广义二项式定理

注意到1(1−x)k=(1−x)−k\frac{1}{(1-x)^k}=(1-x)^{-k}。

我们不禁有个大胆的想法,如果kk可以取任何实数,那么我们就可以表示出1−x,1−x3\sqrt{1-x},\sqrt[3]{1-x}等等的生成函数。

(1+x)α=∑j=0Cjαxj(1+x)^\alpha = \sum_{j=0} C_{j}^{\alpha} x^j。

定义:

C_{\alpha}^{k}=\begin{cases} \frac{\alpha(\alpha-1)(\alpha-2) \dots (\alpha-k+1)}{k!},k>1 \\ 1,k=0 \\ 0,k<0 \end{cases}(k \in \mathbb{Z},\alpha \in \mathbb{R}) \tag{1.1.1}

来自巨佬ypy的博客。

生成函数的应用

例题1

BZOJ 3028

承德汉堡:f(x)=1+x2+x4+x6...=11−x2f(x)=1+x^2+x^4+x^6...=\frac{1}{1-x^2}

可乐:f(x)=1+xf(x)=1+x

鸡腿:f(x)=1+x+x2=1−x31−xf(x)=1+x+x^2=\frac{1-x^3}{1-x}

蜜桃多:f(x)=∑j=0xj−(1+x2+x4+...)=11−x−11−x2=x1−x2f(x)=\sum_{j=0} x^j - (1+x^2+x^4+...)=\frac{1}{1-x}-\frac{1}{1-x^2}=\frac{x}{1-x^2}

鸡块:f(x)=11−x4f(x)=\frac{1}{1-x^4}

包子:f(x)=1+x+x2+x3=1−x41−xf(x)=1+x+x^2+x^3=\frac{1-x^4}{1-x}

土豆片炒肉:f(x)=1+xf(x)=1+x

面包:f(x)=11−x3f(x)=\frac{1}{1-x^3}

乘起来然后大力化简一波,化成了x(1−x)4\frac{x}{(1-x)^4}

套进第二个式子:

x(1−x)4=∑j=0Cj+33xj+1=∑j=1Cj+23xj\frac{x}{(1-x)^4}=\sum_{j=0} C_{j+3}^{3}x_{j+1}=\sum_{j=1} C_{j+2}^{3}x_{j}

于是我们所求的就是Cj+23C_{j+2}^3。

#include <bits/stdc++.h>
#define MAXN 200005
#define MOD 10007
using namespace std;
inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while (ch<'0'||ch>'9'){
        if (ch=='-') f=-1;
        ch=getchar();
    }
    while (ch>='0'&&ch<='9'){
        x=((x<<3)+(x<<1)+(ch^'0'))%MOD;
        ch=getchar();
    }
    return x*f;
}
inline int ksm(int b,int k){
	int ans=1;
	while (k){
		if (k&1) ans=(ans*b)%MOD;
		b=(b*b)%MOD;
		k>>=1;
	}
	return ans;
}
int main(){
	int n=read();
	printf("%d\n",(n+2)*(n+1)%MOD*(n)%MOD*ksm(6,MOD-2)%MOD);
}

例题2

P2000 拯救世界

本质和上面一题是一样的:

kkksc03:

金:11−x6\frac{1}{1-x^6}

木:1−x101−x\frac{1-x^{10}}{1-x}

水:1−x61−x\frac{1-x^6}{1-x}

火:11−x4\frac{1}{1-x^4}

土:1−x81−x\frac{1-x^8}{1-x}

lzn:

金:11−x2\frac{1}{1-x^2}

木:1+x1+x

水:11−x8\frac{1}{1-x^8}

火:11−x10\frac{1}{1-x^{10}}

土:1−x41−x\frac{1-x^4}{1-x}
大力乘起来,算出11−x5\frac{1}{1-x^5}

答案即是Cn+5−15−1=Cn+44C_{n+5-1}^{5-1}=C_{n+4}^4。

只写了python版本:

n=(int)(input())
print((n+1)*(n+2)*(n+3)*(n+4)//24)

例题3

试用生成函数推导斐波那契数列通项公式。

斐波那契数列:fib1=1,fib2=1,fibi=fibi−1+fibi−2(i≥3)fib_1=1,fib_2=1,fib_i=fib_{i-1}+fib_{i-2} (i\ge 3)

构造f(x)=∑j=1fibjxjf(x)=\sum _{j=1} fib_j x^j

所以f(x)×x=∑j=2fibj−1xjf(x) \times x=\sum_{j=2} fib_{j-1}x^j

f(x)−f(x)×x=fib1x+∑j=3fibj−2xj=x+x2×f(x)f(x)-f(x)\times x=fib_1x+\sum_{j=3}^{}fib_{j-2}x^j=x+x^2\times f(x)

所以f(x)=x1−x−x2f(x)=\frac{x}{1-x-x^2}

令ϕ=1+52,ϕ′=1−52\phi =\frac{1+\sqrt{5}}{2},\phi'=\frac{1-\sqrt{5}}{2}。

分解:x1−x−x2=x(1−ϕ′x)(1−ϕx)=15(11−ϕx−11−ϕ′x)\frac{x}{1-x-x^2}=\frac{x}{(1-\phi'x)(1-\phi x)}=\frac{1}{\sqrt{5}}(\frac{1}{1-\phi x} - \frac{1}{1-\phi' x})

根据公式11−x=∑j=0xj\frac{1}{1-x}=\sum _{j=0} x^{j},前面一项化为(ϕ)n(\phi)^n后面一项化成(ϕ′)n(\phi')^n。

于是我们得到fibn=15(ϕn−ϕ′n)fib_n=\frac{1}{\sqrt{5}}(\phi ^n-\phi'^n)。

即fibn=−15(1−52)n+15(1+52)nfib_n=-\frac{1}{\sqrt 5}(\frac{1-\sqrt 5}{2})^n+\frac{1}{\sqrt 5}(\frac{1+\sqrt 5}{2})^n。

补充

已知f0=A,f1=B,fi=pfi−1+qfi−2(i≥2)f_0=A,f_1=B,f_i=pf_{i-1}+qf_{i-2} (i \ge 2)

构造f(x)=∑j=1fjxjf(x)=\sum _{j=1} f_j x^j

所以f(x)×x=∑j=2fj−1xjf(x) \times x= \sum _{j=2} f_{j-1} x^j

得到f(x)−pf(x)×x=Cx+∑j=2fj−2xj=Cx+qx2f(x)f(x)-pf(x) \times x=Cx + \sum _{j=2} f_{j-2}x^j=Cx+q x^2 f(x)(其中CC是一个常数,我们可以不用管它,原理在你使用时自然清楚)

得到f(x)−pxf(x)−qx2f(x)=Cxf(x)-px f(x) -qx^2 f(x)=Cx,于是有f(x)=Cx1−px−qx2f(x)=\frac{Cx}{1-px-qx^2}。

设方程x2−px−q=0x^2-px-q=0的解是x1,x2x_1,x_2(x1,x2x_1,x_2又称特征根),注意到把x=1x1x=\frac{1}{x_1}带入1−px−qx21-px-qx^2,变成1−px1−qx12=x12−px1−qx121-\frac{p}{x_1}-\frac{q}{x_1^2}=\frac{x_1^2-px_1-q}{x_1^2}

显然为00。

于是可以转化为fn=C1x1n+C2x2nf_n=C_1 x_1 ^n +C_2x_2^n

你肯定有疑问,为什么不算出来C1,C2C_1,C_2,直接无脑带进去就好。

事实上C1,C2C_1,C_2公式非常复杂,你肯定也记不住。

考试时,可以解出C1,C2C_1,C_2。

比如一道题:h0=1,h1=3,hn=2hn−1+2hn−2(n≥2)h_0=1,h_1=3,h_n=2h_{n-1}+2h_{n-2} (n\ge 2)。

特征根:x2−2x−2=0→x1,2=2±4+82=1±3x^2-2x-2=0 \to x_{1,2}=\frac{2 \pm \sqrt {4+8}}{2}={1\pm \sqrt{3}}

带入h0=C1+C2,h1=C1x1+C2x2h_0=C_1 +C_2,h_1=C_1x_1+C_2x_2(这里我们特意算出来h0h_0以简化计算)

得到C1+C2=1,C1(1+3)+C2(1−3)=3C_1+C_2=1,C_1(1+\sqrt {3}) +C_2(1-\sqrt{3})=3

解得C1=23+36,C2=−23+36C_1=\frac{2 \sqrt {3}+3}{6},C_2=\frac{-2 \sqrt {3}+3}{6}

通项公式hn=23+36(1+3)n+−23+36(1−3)nh_n=\frac{2 \sqrt {3}+3}{6} (1+\sqrt{3})^n + \frac{-2 \sqrt {3}+3}{6} (1-\sqrt{3})^n

例题4

试用生成函数推导卡特兰数通项公式。

卡特兰数:

c0′=1c'_0=1

c1′=1c'_1=1

cn′=∑i=1n−1ci′cn−i−1′c'_n=\sum_{i=1}^{n-1}c'_ic'_{n-i-1}

为了方便,记ci=ci−1′c_i=c'_{i-1},有ci′=ci+1c'_i=c_{i+1}。

所以有$c_n=c'{n-1}=\sum{i=1}{n-2}c'_ic'_{n-i-2}=\sum_{i=1}{n-2}c_{i+1}c_{n-i-1}=\sum_{i=2}^{n-1}c_ic_{n-i} $

记C(x)=∑i=0cixiC(x)=\sum _{i=0} c_ix^i

有C(x)−C(x)2=C1×x1=xC(x)-C(x)^2=C_1 \times x^1=x。

于是C(x)2−C(x)+x=0C(x)^2-C(x)+x=0

得到C(x)=1±1−4x2C(x)=\frac{1\pm\sqrt{1-4x}}{2}

舍去1+1−4x2\frac{1+\sqrt{1-4x}}{2}

所以C(x)=12x[1−(1−4x)0.5]C(x)=\frac{1}{2x}[1-(1-4x)^{0.5}]

先化简(1−4x)0.5(1-4x)^{0.5}

由(1+x)α=∑j=0Cjαxj(1+x)^\alpha = \sum_{j=0} C_{j}^{\alpha} x^j

有(1−4x)0.5=∑j=0C0.5j(−4x)j(1-4x)^{0.5}=\sum_{j=0} C_{0.5}^{j}(-4x)^j。

注意到这里C0.50(−4x)0=1C_{0.5}^0(-4x)^0=1,把它放到前面去。

拆一波C0.5j=∏k=0j−1(0.5−k)j!C_{0.5}^{j}=\frac{\prod_{k=0}^{j-1} (0.5-k)}{j!}

放回去:∑j=1∏k=0j−1(0.5−k)j!×(−4x)j\sum_{j=1}^ \frac{\prod_{k=0}^{j-1}(0.5-k)}{j!} \times (-4x)^j

右边除掉一个(−2)j(-2)^j,左边乘(−2)j(-2)^j

变成:∑j=1∏k=0j−1(2k−1)j!×(2x)j\sum_{j=1}^ \frac{\prod_{k=0}^{j-1}(2k-1)}{j!} \times (2x)^j

注意到∑k=0j−1=−1×(1×3×5×...×(2j−3))\sum_{k=0}^{j-1}=-1\times (1 \times 3 \times 5 \times ... \times (2j-3)),这里我们把那个−1-1放到前面抵消掉减号,下面不再说明。

这时可以发现(1×3×5×...×(2j−3))=(2j−2)!2j−1(j−1)!(1 \times 3 \times 5 \times ... \times (2j-3))= \frac{(2j-2)!}{2^{j-1}(j-1)!}

于是我们可以得到(1−4x)0.5=1−∑j=12jxj×(2j−2)!2j−1(j−1)!×1j!(1-4x)^{0.5}=1-\sum_{j=1} 2^j x^j \times \frac{(2j-2)!}{2^{j-1}(j-1)!} \times \frac{1}{j!}

等于1−∑j=1xj×2(2j−2)!(j−1)!j!1-\sum_{j=1} x^j \times 2\frac{(2j-2)!}{(j-1)!j!}

带回原式C(x)=12x[1−(1−∑j=0xj×2(2j−2)!(j−1)!j!)]C(x)=\frac{1}{2x}[1-(1-\sum_{j=0} x^j \times 2\frac{(2j-2)!}{(j-1)!j!})]

等于∑j=1xj−1×(2j−2)!(j−1)!j!\sum_{j=1} x^{j-1} \times \frac{(2j-2)!}{(j-1)!j!}。

注意到xx的次数不能是j−1j-1,于是把k=j−1k=j-1带入,变成∑k=0xk×(2k)!k!(k+1)!\sum _{k=0} x^k \times \frac{(2k)!}{k!(k+1)!}

于是得到公式cn=(2n)!n!(n+1)!c_n=\frac{(2n)!}{n!(n+1)!}