抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

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

定义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=1p1p\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),所以p0p^ \to 0,于是原式就是11p\frac{1}{1-p},即11xiw\frac{1}{1-x_i^w}

两种生成函数

前面介绍了第一种生成函数:j=0xj=11x(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,j1)...(j,0)(0,j),(1,j-1)...(j,0)这么多种,共j+1j+1种选法。

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

推广一下:

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

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

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

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

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

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

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

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

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

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

广义二项式定理

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

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

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

定义:

Cαk={α(α1)(α2)(αk+1)k!,k>11,k=00,k<0(kZ,αR)(1.1.1)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...=11x2f(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=1x31xf(x)=1+x+x^2=\frac{1-x^3}{1-x}

蜜桃多:f(x)=j=0xj(1+x2+x4+...)=11x11x2=x1x2f(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)=11x4f(x)=\frac{1}{1-x^4}

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

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

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

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

套进第二个式子:

x(1x)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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#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:

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

木:1x101x\frac{1-x^{10}}{1-x}

水:1x61x\frac{1-x^6}{1-x}

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

土:1x81x\frac{1-x^8}{1-x}

lzn:

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

木:1+x1+x

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

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

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

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

只写了python版本:

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

例题3

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

斐波那契数列:fib1=1,fib2=1,fibi=fibi1+fibi2(i3)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=2fibj1xjf(x) \times x=\sum_{j=2} fib_{j-1}x^j

f(x)f(x)×x=fib1x+j=3fibj2xj=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)=x1xx2f(x)=\frac{x}{1-x-x^2}

ϕ=1+52,ϕ=152\phi =\frac{1+\sqrt{5}}{2},\phi'=\frac{1-\sqrt{5}}{2}

分解:x1xx2=x(1ϕx)(1ϕx)=15(11ϕx11ϕ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})

根据公式11x=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(152)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=pfi1+qfi2(i2)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=2fj1xjf(x) \times x= \sum _{j=2} f_{j-1} x^j

得到f(x)pf(x)×x=Cx+j=2fj2xj=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)=Cx1pxqx2f(x)=\frac{Cx}{1-px-qx^2}

设方程x2pxq=0x^2-px-q=0的解是x1,x2x_1,x_2x1,x2x_1,x_2又称特征根),注意到把x=1x1x=\frac{1}{x_1}带入1pxqx21-px-qx^2,变成1px1qx12=x12px1qx121-\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=2hn1+2hn2(n2)h_0=1,h_1=3,h_n=2h_{n-1}+2h_{n-2} (n\ge 2)

特征根:x22x2=0x1,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(13)=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(13)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=1n1cicni1c'_n=\sum_{i=1}^{n-1}c'_ic'_{n-i-1}

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

所以有cn=cn1=i=1n2cicni2=i=1n2ci+1cni1=i=2n1cicnic_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)2C(x)+x=0C(x)^2-C(x)+x=0

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

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

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

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

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

(14x)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=0j1(0.5k)j!C_{0.5}^{j}=\frac{\prod_{k=0}^{j-1} (0.5-k)}{j!}

放回去:j=1k=0j1(0.5k)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=1k=0j1(2k1)j!×(2x)j\sum_{j=1}^ \frac{\prod_{k=0}^{j-1}(2k-1)}{j!} \times (2x)^j

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

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

于是我们可以得到(14x)0.5=1j=12jxj×(2j2)!2j1(j1)!×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!}

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

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

等于j=1xj1×(2j2)!(j1)!j!\sum_{j=1} x^{j-1} \times \frac{(2j-2)!}{(j-1)!j!}

注意到xx的次数不能是j1j-1,于是把k=j1k=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)!}

评论