算法模板(5):数学(3):多项式2

生成函数

普通型母函数

普通型母函数的乘法和“多重集的组合问题”有关。

生成函数即母函数,就是离散数学课讲的,给一个无穷序列 { 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=0aixi.

举个例子, { 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} 1x1=1+x+x2+x3+(1x)N+11  =i=0CN+iNxi1x1xN+1 =1+x+x2++xN1x21  =1+x2+x4+1x2x  =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+k1k1. 而对于每个物品的多项式为 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} (1x)k1,把这个展开为多项式, x n x^n xn 的系数,其实就是上述问题的答案,即 C n + k − 1 k − 1 . C_{n+k-1}^{k-1}. Cn+k1k1. 这个也可以看作是 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 (1x)N+11  =i=0CN+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:

3132. 食物

问组成 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+...=1x211+x1+x+x2=1x1x3x+x3+x5+...=1x2x1+x4+x8+...=1x411+x+x2+x3=1x1x41+x1+x3+x6+...=1x31

八个多项式相乘,最后得到的多项式是 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)=(1x)4x=i=0Ci+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 n1 ​位的,有偶数个 5 5 5 的数的末尾添了一个非 5 5 5数。
  • 一个 n − 1 n-1 n1​ 位的,有奇数个 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=9an1+bn1bn=9bn1+an1

{ 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)=(18x)(110x)71x+8A(x)=21(18x7+110x9)

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=07(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(78n+910n)

例子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=0aixi​. 那么求一次前缀和相当于乘 ∑ i = 0 ∞ x i \sum\limits_{i=0}^\infty x^i i=0xi​​,求一次差分相当于乘 ( 1 − x ) (1-x) (1x)​.

那么 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)(1x)k1=i=0j=0iCk+jjaijxi​​​.

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)(1x)k=i=0j=0i(1)jCijaijxi

生成函数入门

指数型生成函数

指数型母函数的乘法和“多重集的排列问题”有关。

{ 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+ex  =1+2!x2+4!x4+6!x6+2exex  =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={n1a1,n2a2,...,nkak},则 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+ex​表示,于是得出生成函数为

( e x + e − x ) 2 e 2 x 4 \dfrac{(e^x+e^{-x})^2e^{2x}}4 4(ex+ex)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=044i+22ii!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+22i(i=0)1 (i=0)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值