文章目录
生成函数
引言
定义
实数序列
a
0
、
a
1
、
a
2
、
…
…
、
a
n
a_0、a_1、a_2、……、a_n
a0、a1、a2、……、an的生成函数,是无穷级数
G
(
x
)
=
∑
k
=
0
∞
a
k
∗
x
k
=
a
0
+
a
1
∗
x
+
a
2
∗
x
2
+
…
…
+
a
k
∗
x
k
+
…
…
G(x)=\sum_{k=0}^{\infty} a_k*x^{k}=a_0+a_1*x+a_2*x^2+……+a_k*x^k+……
G(x)=k=0∑∞ak∗xk=a0+a1∗x+a2∗x2+……+ak∗xk+……
上述的生成函数也被称为普通生成函数,因为还有其他类型的生成函数。
也就是说,我们将一个数的序列对应到一个函数,而这个函数的幂级数展开的各项系数就是这个序列。
有关幂级数的有用事实
形式幂级数
如果将级数的收敛问题忽略掉,也就是不关心幂级数的收敛域,这样的级数就称为形式幂级数。
幂级数的和、积
若
f
(
x
)
=
∑
k
=
0
∞
a
k
∗
x
k
f(x)=\sum_{k=0}^{\infty} a_k*x^{k}
f(x)=∑k=0∞ak∗xk,
g
(
x
)
=
∑
k
=
0
∞
b
k
∗
x
k
g(x)=\sum_{k=0}^{\infty} b_k*x^{k}
g(x)=∑k=0∞bk∗xk;
则,
- 和
f ( x ) + g ( x ) = ∑ k = 0 ∞ ( a k + b k ) ∗ x k f(x)+g(x)=\sum_{k=0}^{\infty} (a_k+b_k)*x^{k} f(x)+g(x)=∑k=0∞(ak+bk)∗xk - 积
f ( x ) g ( x ) = ∑ k = 0 ∞ ( ∑ j = 0 k a j ∗ b k − j ) ∗ x k f(x)g(x)=\sum_{k=0}^{\infty} (\sum_{j=0}^k a_j*b_{k-j})*x^{k} f(x)g(x)=∑k=0∞(∑j=0kaj∗bk−j)∗xk
广义二项式定理
-
广义二项式系数
设 u u u是实数,且 k k k是非负整数。那么广义二项式系数
( u k ) = { u ( u − 1 ) ∗ … … ∗ ( u − k + 1 ) , k > 0 1 , k = 0 \binom{u}{k}= \begin{cases} u(u-1)*……*(u-k+1), k>0\\ 1,k= 0\\ \end{cases} (ku)={u(u−1)∗……∗(u−k+1),k>01,k=0 -
当u为负整数,广义二项式系数为
( − n r ) = C ( − n , r ) = ( − 1 ) r C ( n + r − 1 , r ) \binom{-n}{r}=C(-n,r)=(-1)^rC(n+r-1,r) (r−n)=C(−n,r)=(−1)rC(n+r−1,r) -
广义二项式定理
( 1 + x ) u = ∑ k = 0 ∞ ( u k ) x k (1+x)^u=\sum_{k=0}^{\infty}\binom{u}{k}x^k (1+x)u=k=0∑∞(ku)xk
ps 当u是正整数是,就是普通的二项式定理,因为 C ( u , k ) , u > k C(u,k),u>k C(u,k),u>k时为0。
常见的生成函数
- 微积分中经典的级数
G(x) | a k a_k ak |
---|---|
l n ( 1 + x ) = x − x 2 / x + x 3 / 3 ln(1+x) =x-x^2/x+x^3/3 ln(1+x)=x−x2/x+x3/3+…… | ( − 1 ) k + 1 / k (-1)^{k+1}/k (−1)k+1/k |
e x = ∑ k = 0 ∞ x k / k ! = 1 + x + x 2 / 2 + x 3 / 3 ! + … … e^x=\sum_{k=0}^{\infty}x^k/k!=1+x+x^2/2+x^3/3!+…… ex=∑k=0∞xk/k!=1+x+x2/2+x3/3!+…… | 1 / k ! 1/k! 1/k! |
- 二项式定理相关
G(x) | a k a_k ak |
---|---|
( 1 + x ) n = ∑ k = 0 ∞ C ( n , k ) x k (1+x)^n=\sum_{k=0}^{\infty}C(n,k)x^k (1+x)n=∑k=0∞C(n,k)xk | C ( n , k ) C(n,k) C(n,k) |
( 1 + a x ) n = ∑ k = 0 ∞ a k C ( n , k ) x k (1+ax)^n=\sum_{k=0}^{\infty}a^kC(n,k)x^k (1+ax)n=∑k=0∞akC(n,k)xk | C ( n , k ) a k C(n,k)a^k C(n,k)ak |
- 广义二项式定理相关
G(x) | a k a_k ak |
---|---|
1 / ( 1 − x ) = ∑ k = 0 ∞ x k 1/(1-x)=\sum_{k=0}^{\infty}x^k 1/(1−x)=∑k=0∞xk | 1 |
1 / ( 1 − a x ) = ∑ k = 0 ∞ a k x k 1/(1-ax)=\sum_{k=0}^{\infty}a^kx^k 1/(1−ax)=∑k=0∞akxk | a k a^k ak |
1 / ( 1 − x r ) = ∑ k = 0 ∞ x r k 1/(1-x^r)=\sum_{k=0}^{\infty}x^{rk} 1/(1−xr)=∑k=0∞xrk | |
1 / ( 1 − x ) 2 = ∑ k = 0 ∞ ( k + 1 ) x k 1/(1-x)^2=\sum_{k=0}^{\infty}(k+1)x^k 1/(1−x)2=∑k=0∞(k+1)xk | k + 1 k+1 k+1 |
1 / ( 1 − x ) n = ∑ k = 0 ∞ C ( n + k − 1 , k ) x k 1/(1-x)^n=\sum_{k=0}^{\infty}C(n+k-1,k)x^k 1/(1−x)n=∑k=0∞C(n+k−1,k)xk | C ( n + k − 1 , k ) C(n+k-1,k) C(n+k−1,k) |
使用生成函数解决计数问题
不定方程的解的个数
e
1
+
e
2
+
…
…
+
e
n
=
m
e_1+e_2+……+e_n=m
e1+e2+……+en=m
求非负整数解的方案数。
可以用隔板法求出得
C
(
m
+
n
−
1
,
m
)
C(m+n-1,m)
C(m+n−1,m)。
利用生成函数的思想:
(
1
+
x
1
+
x
2
+
…
…
x
m
)
(
1
+
x
1
+
x
2
+
…
…
+
x
m
)
(
1
+
x
1
+
x
2
+
…
…
+
x
m
)
(
1
+
x
1
+
x
2
+
…
…
+
x
m
)
…
…
(
n
项
)
(1+x^1+x^2+……x^m)(1+x^1+x^2+……+x^m)(1+x^1+x^2+……+x^m)(1+x^1+x^2+……+x^m)……(n项)
(1+x1+x2+……xm)(1+x1+x2+……+xm)(1+x1+x2+……+xm)(1+x1+x2+……+xm)……(n项)
那么
x
m
x^m
xm项的系数就是原问题的方案数。
这在
e
1
、
e
2
、
…
…
e_1、e_2、……
e1、e2、……有约束限制的时候,更显优势。
比如
e
1
+
e
2
+
…
…
+
e
3
=
17
e_1+e_2+……+e_3=17
e1+e2+……+e3=17,且
2
<
=
e
1
<
=
5
、
3
<
=
e
2
<
=
6
、
4
<
=
e
3
<
=
7
2<=e1<=5、3<=e2<=6、4<=e3<=7
2<=e1<=5、3<=e2<=6、4<=e3<=7
那么上述解的个数是
(
x
2
+
x
3
+
x
4
+
x
5
)
(
x
3
+
x
4
+
x
5
+
x
6
)
(
x
4
+
x
5
+
x
6
+
x
7
)
(x^2+x^3+x^4+x^5)(x^3+x^4+x^5+x^6)(x^4+x^5+x^6+x^7)
(x2+x3+x4+x5)(x3+x4+x5+x6)(x4+x5+x6+x7)的
x
17
x^{17}
x17项的系数。
- 有这样的一个例子:
有一堆的1元、2元、5元硬币,数量不限,用它们组和成总和为 r r r元。
有多少方案。
完全背包问题的方案数
- 动态规划解法
这其实是一个完全背包问题求方案数的问题。
f
[
i
]
[
j
]
=
∑
k
=
0
m
a
x
K
f
[
i
−
1
]
[
j
−
k
∗
v
]
f[i][j] = \sum_{k=0}^{maxK} f[i-1][j-k*v]
f[i][j]=∑k=0maxKf[i−1][j−k∗v]
当然可以再使用递推关系式优化成
f
[
i
]
[
j
]
f[i][j]
f[i][j] =
f
[
i
−
1
]
[
j
]
+
f
[
i
]
[
j
−
v
]
f[i-1][j]+f[i][j-v]
f[i−1][j]+f[i][j−v]
- 生成函数解法
仿照我们上面的解法,
方案数就是
( 1 + x + x 2 + x 3 + … … ) ( 1 + x 2 + x 4 + x 6 + … … ) ( 1 + x 5 + x 10 + x 15 + … … ) (1+x+x^2+x^3+……)(1+x^2+x^4+x^6+……)(1+x^5+x^{10}+x^{15}+……) (1+x+x2+x3+……)(1+x2+x4+x6+……)(1+x5+x10+x15+……)
的 x r x^r xr的系数。
第一项表示选择1元硬币,比如第一项中的 x 7 x^7 x7表示选了7个一元硬币,如此推知,每一项实际上对应着DP过程中考虑每一个物品。
有顺序的背包问题的方案数
-
动态规划解法
这种解法类似于跳楼梯问题,每次跳一级或者两级,跳到100级有多少中跳法。
递推方程: f [ i ] = f [ i − 1 ] + f [ i − 2 ] + f [ i − 5 ] f[i]=f[i-1]+f[i-2]+f[i-5] f[i]=f[i−1]+f[i−2]+f[i−5] -
生成函数解法
考虑恰好一共选了 n n n个硬币产生 r r r元的方案数,因为考虑了顺序,
所以此时的方案数为 ( x + x 2 + x 5 ) n (x+x^2+x^5)^n (x+x2+x5)n中 x r x^r xr的系数
因为可以用任意多次硬币去形成 r r r元,所以按照加法原理。
总方案数是
1 + ( x + x 2 + x 5 ) + ( x + x 2 + x 5 ) 2 + ( x + x 2 + x 5 ) 3 + … … 1+(x+x^2+x^5)+(x+x^2+x^5)^2+(x+x^2+x^5)^3+…… 1+(x+x2+x5)+(x+x2+x5)2+(x+x2+x5)3+……的 x r x^r xr的系数。
使用生成函数求解递推关系
通过寻找生成函数的显式公式来求解满足递推关系和初始条件的解。
不过这种方案具有很大的局限性。
如果可以使用求解线性递推关系的那种方案,生成函数法并不是首选方案。
举一例说明:
a
n
=
8
∗
a
n
−
1
+
1
0
n
−
1
①
a_n=8*a_{n-1}+10^{n-1}①
an=8∗an−1+10n−1①
两边同乘
x
n
x^n
xn:
a
n
∗
x
n
=
8
∗
a
n
−
1
x
n
+
1
0
n
−
1
②
a_n*x^n=8*a_{n-1}x^n+10^{n-1}②
an∗xn=8∗an−1xn+10n−1②
两边从
n
=
1
n=1
n=1开始求和:
G
(
x
)
−
1
=
∑
n
=
1
∞
a
n
∗
x
n
=
∑
n
=
1
∞
(
8
∗
a
n
−
1
∗
x
n
+
1
0
n
−
1
∗
x
n
)
=
8
x
∑
n
=
1
∞
(
a
n
−
1
∗
x
n
−
1
)
+
x
∗
∑
n
=
1
∞
1
0
n
−
1
x
n
−
1
=
8
x
G
(
x
)
+
x
/
(
1
−
10
x
)
G(x)-1 = \sum_{n=1}^{\infty}a_n*x_n\\ =\sum_{n=1}^{\infty}(8*a_{n-1}*x^n+10^{n-1}*x^n)\\ =8x\sum_{n=1}^{\infty}(a_{n-1}*x^{n-1})+x*\sum_{n=1}^{\infty}10^{n-1}x^{n-1}\\ =8xG(x)+x/(1-10x)
G(x)−1=n=1∑∞an∗xn=n=1∑∞(8∗an−1∗xn+10n−1∗xn)=8xn=1∑∞(an−1∗xn−1)+x∗n=1∑∞10n−1xn−1=8xG(x)+x/(1−10x)
求出
G
(
x
)
=
(
1
−
9
x
)
/
(
(
1
−
8
x
)
(
1
−
10
x
)
)
=
1
/
2
(
1
/
(
1
−
8
x
)
+
1
/
(
1
−
10
x
)
)
=
1
/
2
(
∑
0
∞
8
n
+
∑
0
∞
1
0
n
)
x
n
G(x)=(1-9x)/((1-8x)(1-10x))\\ = 1/2(1/(1-8x)+1/(1-10x))\\ = 1/2(\sum_{0}^{\infty}8^n+\sum_{0}^{\infty}10^{n})x^n\\
G(x)=(1−9x)/((1−8x)(1−10x))=1/2(1/(1−8x)+1/(1−10x))=1/2(0∑∞8n+0∑∞10n)xn
所以,
a
n
=
1
/
2
(
8
n
+
1
0
n
)
a_n=1/2(8^n+10^n)
an=1/2(8n+10n)