生成函数
普通型母函数
普通型母函数的乘法和“多重集的组合问题”有关。
生成函数即母函数,就是离散数学课讲的,给一个无穷序列 { a 0 , a 1 , . . . a n , . . . } \{a_0,a_1,...a_n,...\} {a0,a1,...an,...},称 f ( x ) = a 0 + a 1 x + a 2 x 2 + . . . + a n x n + . . . = ∑ i = 0 ∞ a i x i . f(x) = a_0 + a_1x+a_2x^2 + ... + a_nx^n+... = \sum\limits_{i=0}^{\infty}a_ix^i. f(x)=a0+a1x+a2x2+...+anxn+...=i=0∑∞aixi.
举个例子,
{
C
n
0
,
C
n
1
,
.
.
.
C
n
k
,
.
.
.
C
n
n
.
.
.
}
\{C_{n}^{0}, C_n^1,...C_n^k,...C_n^n...\}
{Cn0,Cn1,...Cnk,...Cnn...} 的普通母函数的为
(
1
+
x
)
n
(1+x)^n
(1+x)n.
{
1
1
−
x
=
1
+
x
+
x
2
+
x
3
+
…
1
(
1
−
x
)
N
+
1
=
∑
i
=
0
∞
C
N
+
i
N
x
i
1
−
x
N
+
1
1
−
x
=
1
+
x
+
x
2
+
⋯
+
x
N
1
1
−
x
2
=
1
+
x
2
+
x
4
+
…
x
1
−
x
2
=
x
+
x
3
+
x
5
+
…
\begin{cases}\dfrac{1}{1-x}\quad\quad=1+x+x^2+x^3+\dots\\ \dfrac{1}{(1-x)^{N+1}}\ \ =\sum_{i=0}^\infty C_{N+i}^Nx^i\\ \dfrac{1-x^{N+1}}{1-x}\quad\ =1+x+x^2+\dots+x^N\\ \dfrac{1}{1-x^2}\quad\ \ =1+x^2+x^4+\dots\\ \dfrac{x}{1-x^2}\quad\ \ =x+x^3+x^5+\dots\end{cases}
⎩
⎨
⎧1−x1=1+x+x2+x3+…(1−x)N+11 =∑i=0∞CN+iNxi1−x1−xN+1 =1+x+x2+⋯+xN1−x21 =1+x2+x4+…1−x2x =x+x3+x5+…
解释一下,前两个式子可以看作 1 G ( x ) = F ( x ) \frac{1}{G(x)} = F(x) G(x)1=F(x),即 F ( x ) G ( x ) = 1 F(x)G(x) = 1 F(x)G(x)=1,已知 G ( x ) G(x) G(x),然后凑出来 F ( x ) F(x) F(x).
再举个例子。假设有 k k k 个物品,每个物品无限多个,那么选 n n n 个物品的组合数用隔板法或不定方程解的个数 ( x 1 + x 2 + . . . + x k = n x_1+x_2+...+x_k = n x1+x2+...+xk=n ) 可以求出是 C n + k − 1 k − 1 C_{n+k-1}^{k-1} Cn+k−1k−1. 而对于每个物品的多项式为 f ( x ) = 1 + x + x 2 + . . . + x n + . . . f(x) = 1+x+x^2+...+x^n+... f(x)=1+x+x2+...+xn+... 那么,这 k k k 个多项式的卷积为 1 ( 1 − x ) k \frac{1}{(1-x)^k} (1−x)k1,把这个展开为多项式, x n x^n xn 的系数,其实就是上述问题的答案,即 C n + k − 1 k − 1 . C_{n+k-1}^{k-1}. Cn+k−1k−1. 这个也可以看作是 1 ( 1 − x ) N + 1 = ∑ i = 0 ∞ C N + i N x i \dfrac{1}{(1-x)^{N+1}}\ \ =\sum_{i=0}^\infty C_{N+i}^Nx^i (1−x)N+11 =∑i=0∞CN+iNxi 的解释。
生成函数方法一般都是把原问题分成若干子问题。就比如这个选法码,子问题就是每个法码怎么选。而定义的多项式 g ( x ) = a 0 + a 1 x + a 2 x 2 + . . . + a n x n g(x) = a_0+a_1x+a_2x^2+...+a_nx^n g(x)=a0+a1x+a2x2+...+anxn,x 的取值通常是 ( − 1 , 1 ) (-1,1) (−1,1),这样可以保证多项式是收敛的。
例子1:
问组成 n n n 个物品有多少种方案.
- 承德汉堡:偶数个。
- 可乐:0 个或 1 个。
- 鸡腿:0 个,1 个或 2 个。
- 蜜桃多:奇数个。
- 鸡块:4 的倍数个。
- 包子:0 个,1 个,2 个或 3 个。
- 土豆片炒肉:不超过一个。
- 面包:3 的倍数个。
{ 1 + x 2 + x 4 + . . . = 1 1 − x 2 1 + x 1 + x + x 2 = 1 − x 3 1 − x x + x 3 + x 5 + . . . = x 1 − x 2 1 + x 4 + x 8 + . . . = 1 1 − x 4 1 + x + x 2 + x 3 = 1 − x 4 1 − x 1 + x 1 + x 3 + x 6 + . . . = 1 1 − x 3 \begin{cases} 1 + x^2 + x^4 + ... = \frac{1}{1 - x^2} \\ 1 + x \\ 1 + x + x^2 = \frac{1 - x^3}{1-x}\\ x + x^3 + x^5 + ... = \frac{x}{1 - x^2} \\ 1 + x^4 + x^8 + ... = \frac{1}{1 - x^4} \\ 1 + x + x^2 + x^3 = \frac{1 - x^4}{1-x} \\ 1 + x\\ 1 + x^3 + x^6 + ... = \frac{1}{1 - x^3} \end{cases} ⎩ ⎨ ⎧1+x2+x4+...=1−x211+x1+x+x2=1−x1−x3x+x3+x5+...=1−x2x1+x4+x8+...=1−x411+x+x2+x3=1−x1−x41+x1+x3+x6+...=1−x31
八个多项式相乘,最后得到的多项式是 f ( x ) = x ( 1 − x ) 4 = ∑ i = 0 ∞ C i + 3 i x i f(x) = \frac{x}{(1 - x)^4} = \sum\limits_{i=0}^{\infty}C_{i+3}^{i}x^i f(x)=(1−x)4x=i=0∑∞Ci+3ixi
答案就是 C n + 2 3 C_{n+2}^3 Cn+23.
例子2:
求在十进制下, N N N 位的(不允许有前导 0 0 0),写出来有偶数个 5 5 5 的数字的个数。
设答案为 a n a_n an,把“偶数”改成“奇数”的话答案为 b n b_n bn。显然地 a 1 = 8 , b 1 = 1 a_1=8,b_1=1 a1=8,b1=1。
对于一个 n n n 位的,有偶数个 5 5 5 的数,它只有两种可能:
- 一个 n − 1 n-1 n−1 位的,有偶数个 5 5 5 的数的末尾添了一个非 5 5 5数。
- 一个 n − 1 n-1 n−1 位的,有奇数个 5 5 5 的数的末尾添了一个 5 5 5。
{ a n = 9 a n − 1 + b n − 1 b n = 9 b n − 1 + a n − 1 \begin{cases} a_n=9a_{n-1}+b_{n-1} \\ b_n=9b_{n-1}+a_{n-1} \end{cases} {an=9an−1+bn−1bn=9bn−1+an−1
{ A ( x ) − 9 x A ( x ) − x B ( x ) = a 1 = 8 B ( x ) − 9 x B ( x ) − x A ( x ) = b 1 = 1 \begin{cases} A(x)-9xA(x)-xB(x)=a_1=8 \\ B(x)-9xB(x)-xA(x)=b_1=1 \end{cases} {A(x)−9xA(x)−xB(x)=a1=8B(x)−9xB(x)−xA(x)=b1=1
解得
{
A
(
x
)
=
−
71
x
+
8
(
1
−
8
x
)
(
1
−
10
x
)
A
(
x
)
=
1
2
(
7
1
−
8
x
+
9
1
−
10
x
)
\begin{cases} A(x)=\dfrac{-71x+8}{(1-8x)(1-10x)} \\ A(x)=\dfrac 1 2(\dfrac 7 {1-8x}+\dfrac 9 {1-10x}) \end{cases}
⎩
⎨
⎧A(x)=(1−8x)(1−10x)−71x+8A(x)=21(1−8x7+1−10x9)
A ( x ) = 1 2 ∑ i = 0 ∞ 7 ∗ ( 8 x ) i + 9 ∗ ( 10 x ) i A(x)=\dfrac 1 2\sum_{i=0}^\infty 7*(8x)^i+9*(10x)^i A(x)=21i=0∑∞7∗(8x)i+9∗(10x)i
即 a n = 1 2 ( 7 ∗ 8 n + 9 ∗ 1 0 n ) a_n=\dfrac 1 2(7*8^n+9*10^n) an=21(7∗8n+9∗10n)
例子3:给定一个长为 n n n 的序列 a a a,求出其 k k k 阶差分或前缀和。
序列对应的生成函数是 a ( x ) = ∑ i = 0 ∞ a i x i a(x) = \sum\limits_{i=0}^{\infty}a_ix^i a(x)=i=0∑∞aixi. 那么求一次前缀和相当于乘 ∑ i = 0 ∞ x i \sum\limits_{i=0}^\infty x^i i=0∑∞xi,求一次差分相当于乘 ( 1 − x ) (1-x) (1−x).
那么 k k k 阶前缀和相当于 a ( x ) ∗ 1 ( 1 − x ) k = ∑ i = 0 ∞ ∑ j = 0 i C k + j j a i − j x i a(x) * \frac{1}{(1-x)^k} = \sum\limits_{i=0}^\infty\sum\limits_{j=0}^iC_{k+j}^ja_{i-j} x^i a(x)∗(1−x)k1=i=0∑∞j=0∑iCk+jjai−jxi.
求 k k k 阶差分相当于 a ( x ) ∗ ( 1 − x ) k = ∑ i = 0 ∞ ∑ j = 0 i ( − 1 ) j C i j a i − j x i a(x) * (1-x)^k = \sum\limits_{i=0}^\infty\sum\limits_{j=0}^i(-1)^jC_{i}^ja_{i-j} x^i a(x)∗(1−x)k=i=0∑∞j=0∑i(−1)jCijai−jxi
指数型生成函数
指数型母函数的乘法和“多重集的排列问题”有关。
{ e x = 1 + x + x 2 2 ! + x 3 3 ! + … e x + e − x 2 = 1 + x 2 2 ! + x 4 4 ! + x 6 6 ! + … e x − e − x 2 = x + x 3 3 ! + x 5 5 ! + x 7 7 ! + … \begin{cases}e^x\quad\quad\quad\ \ =1+x+\dfrac{x^2}{2!}+\dfrac{x^3}{3!}+\dots\\\dfrac{e^x+e^{-x}}2\ \ =1+\dfrac{x^2}{2!}+\dfrac{x^4}{4!}+\dfrac{x^6}{6!}+\dots\\\dfrac{e^x-e^{-x}}2\ \ =x+\dfrac{x^3}{3!}+\dfrac{x^5}{5!}+\dfrac{x^7}{7!}+\dots\end{cases} ⎩ ⎨ ⎧ex =1+x+2!x2+3!x3+…2ex+e−x =1+2!x2+4!x4+6!x6+…2ex−e−x =x+3!x3+5!x5+7!x7+…
式子 1 1 1 对应的可以选任意多个,式子 2 2 2 对应只能选偶数个,式子 3 3 3 对应只能选奇数个.
例题1
用两个1,两个3,一个5,能排成多少个不同的四位数?
展开 ( 1 + x + x 2 2 ! ) ( 1 + x + x 2 2 ! ) (1+x+\dfrac{x^2}{2!})(1+x+\dfrac{x^2}{2!}) (1+x+2!x2)(1+x+2!x2)。 x 4 4 ! \dfrac{x^4}{4!} 4!x4 的系数就是答案。
可以从多重集的排列数考虑:设
S
S
S 有
k
k
k 个不同类型的元素,第
i
i
i 个类型的元素的重数为
n
i
n_i
ni 的重集
(
i
=
1
,
2
,
.
.
.
,
k
)
(i=1,2,...,k)
(i=1,2,...,k),即
S
=
{
n
1
⋅
a
1
,
n
2
⋅
a
2
,
.
.
.
,
n
k
⋅
a
k
}
S = \{n_1 \cdot a_1, n_2 \cdot a_2,...,n_k \cdot a_k \}
S={n1⋅a1,n2⋅a2,...,nk⋅ak},则
S
S
S 的排列数为
(
n
1
+
n
2
+
.
.
.
+
n
k
)
!
n
1
!
n
2
!
.
.
.
n
k
!
\frac{(n_1 + n_2 + ... + n_k)!}{n_1!n_2!...n_k!}
n1!n2!...nk!(n1+n2+...+nk)!
例题2
求由 ACTG 组成的 n n n 位字符串的个数,其中 A 和 C 必须出现偶数次。
A 和 C 可以用之前的 e x + e − x 2 \dfrac{e^x+e^{-x}}2 2ex+e−x表示,于是得出生成函数为
( e x + e − x ) 2 e 2 x 4 \dfrac{(e^x+e^{-x})^2e^{2x}}4 4(ex+e−x)2e2x
括号拆成
e 4 x + 2 e 2 x + 1 4 \dfrac{e^{4x}+2e^{2x}+1}{4} 4e4x+2e2x+1
还是还原回sigma的形式:
1 4 + ∑ i = 0 ∞ 4 i + 2 ∗ 2 i 4 ∗ x i i ! \dfrac 1 4+\sum_{i=0}^\infty \dfrac{4^i+2*2^i}4*\dfrac{x^i}{i!} 41+i=0∑∞44i+2∗2i∗i!xi
a n = { 4 i + 2 ∗ 2 i 4 ( i ≠ 0 ) 1 ( i = 0 ) a_n=\begin{cases}\dfrac{4^i+2*2^i} 4\quad\quad(i\neq0)\\1\quad\quad\quad\quad\quad\quad\ \!(i=0)\end{cases} an=⎩ ⎨ ⎧44i+2∗2i(i=0)1 (i=0)