【学习笔记】母函数(生成函数)

0.夯实基础

泰勒展开啊,导数啊,形式幂级数啊……都是常识,不讲了。这里写几个你可能没推过的。(至少我是第一次推。)
f ( x ) = ln ⁡ ( x + 1 ) f(x)=\ln(x+1) f(x)=ln(x+1)

可以求出其 i i i 阶导数为
f ( i ) ( x ) = ( − 1 ) i − 1 ( i − 1 ) ! ( x + 1 ) − i f^{(i)}(x)=(-1)^{i-1}(i-1)!(x+1)^{-i} f(i)(x)=(1)i1(i1)!(x+1)i

使用麦克劳林展开,得到
f ( x ) = ∑ n = 1 + ∞ ( − 1 ) n − 1 x n n f(x)=\sum_{n=1}^{+\infty}(-1)^{n-1}\frac{x^n}{n} f(x)=n=1+(1)n1nxn

进而有
− f ( − x ) = ∑ n = 1 + ∞ x n n -f(-x)=\sum_{n=1}^{+\infty}\frac{x^n}{n} f(x)=n=1+nxn

1.普通母函数

1.1.定义

母函数,也称作 生成函数,是指这样的一个函数: f ( x ) = ∑ i = 0 n a i x i f(x)=\sum_{i=0}^{n}a_i x^i f(x)=i=0naixi

n n n 可以趋近于正无穷,也可以是某个具体的值。

注意,这个 f ( x ) f(x) f(x)形式幂级数,即 x x x 只起到辅助作用。

1.2.性质

部分母函数具有 闭形式,譬如 f ( x ) = ∑ i = 0 + ∞ x i = 1 1 − x f(x)=\sum_{i=0}^{+\infty}x^i=\frac{1}{1-x} f(x)=i=0+xi=1x1

再如
g ( x ) = ∑ i = 0 + ∞ ( k − 1 + i k − 1 ) x i = 1 ( 1 − x ) k g(x)=\sum_{i=0}^{+\infty}{k-1+i\choose k-1}x^i=\frac{1}{(1-x)^k} g(x)=i=0+(k1k1+i)xi=(1x)k1

因为 g ( x ) g(x) g(x) 的闭形式可以由 f ( x ) f(x) f(x) 两边求 k − 1 k-1 k1 次导数而来。

毫无疑问,闭形式与开形式是等价的,所以很多计数问题都变的可以计算。

1.3.应用

1.3.1.通项公式

例1.3.1. 求这个数列的通项公式: a 0 = a 1 = 1 ,    a n + 2 = a n + a n + 1 ( n ∈ N ) a_0=a_1=1,\;a_{n+2}=a_{n}+a_{n+1}(n\in\N) a0=a1=1,an+2=an+an+1(nN)
解: 考虑其生成函数 f ( x ) = ∑ i = 0 + ∞ a i x i f(x)=\sum_{i=0}^{+\infty}a_{i} x^i f(x)=i=0+aixi

注意到 − x f ( x ) = ∑ i = 1 + ∞ − a i − 1 x i − x 2 f ( x ) = ∑ i = 2 + ∞ − a i − 2 x i -xf(x)=\sum_{i=1}^{+\infty}-a_{i-1} x^i\\-x^2f(x)=\sum_{i=2}^{+\infty}-a_{i-2}x^i xf(x)=i=1+ai1xix2f(x)=i=2+ai2xi

再结合 a 0 = a 1 = 1 ,    a n + 2 = a n + a n + 1 a_0=a_1=1,\;a_{n+2}=a_{n}+a_{n+1} a0=a1=1,an+2=an+an+1 ,得到

( 1 − x − x 2 ) f ( x ) = 1 ⇒ f ( x ) = 1 1 − x − x 2 = 5 + 5 10 1 − 1 + 5 2 x + 5 − 5 10 1 − 1 − 5 2 x (1-x-x^2)f(x)=1\\ \Rightarrow f(x)=\frac{1}{1-x-x^2}=\frac{\frac{5+\sqrt 5}{10}}{1-\frac{1+\sqrt 5}{2}x}+\frac{\frac{5-\sqrt 5}{10}}{1-\frac{1-\sqrt 5}{2}x} (1xx2)f(x)=1f(x)=1xx21=121+5 x105+5 +1215 x1055

将其转化为开形式,得到

f ( x ) = 5 + 5 10 ∑ i = 0 + ∞ ( 1 + 5 2 x ) i + 5 − 5 10 ∑ i = 0 + ∞ ( 1 − 5 2 x ) i = ∑ i = 0 + ∞ 5 5 [ ( 1 + 5 2 ) i + 1 − ( 1 − 5 2 ) i + 1 ] x i \begin{aligned} f(x)&=\frac{5+\sqrt 5}{10}\sum_{i=0}^{+\infty}\left(\frac{1+\sqrt 5}{2}x\right)^i+\frac{5-\sqrt 5}{10}\sum_{i=0}^{+\infty}\left(\frac{1-\sqrt 5}{2}x\right)^i\\ &=\sum_{i=0}^{+\infty}\frac{\sqrt 5}{5}\left[\left(\frac{1+\sqrt 5}{2}\right)^{i+1}-\left(\frac{1-\sqrt 5}{2}\right)^{i+1}\right]x^i \end{aligned} f(x)=105+5 i=0+(21+5 x)i+1055 i=0+(215 x)i=i=0+55 (21+5 )i+1(215 )i+1xi

∴ a n = 5 5 [ ( 1 + 5 2 ) n + 1 − ( 1 − 5 2 ) n + 1 ] \therefore a_n=\frac{\sqrt 5}{5}\left[\left(\frac{1+\sqrt 5}{2}\right)^{n+1}-\left(\frac{1-\sqrt 5}{2}\right)^{n+1}\right] an=55 (21+5 )n+1(215 )n+1

更一般的说,我们最终会得到一个式子
M ( x ) f ( x ) = R ( x ) M(x)f(x)=R(x) M(x)f(x)=R(x)

其中 M ( x ) , R ( x ) M(x),R(x) M(x),R(x) 都是有限次。设
M ( x ) = ∏ i = 1 k ( x − λ i ) t i M(x)=\prod_{i=1}^{k}(x-\lambda_i)^{t_i} M(x)=i=1k(xλi)ti

则可以解出 k k k 个多项式 A 1 ( x ) , A 2 ( x ) , … , A k ( x ) A_1(x),A_2(x),\dots,A_k(x) A1(x),A2(x),,Ak(x) 使得
f ( x ) = R ( x ) M ( x ) = ∑ i = 1 k A i ( x ) ( x − λ i ) t i f(x)=\frac{R(x)}{M(x)}=\sum_{i=1}^{k}\frac{A_i(x)}{(x-\lambda_i)^{t_i}} f(x)=M(x)R(x)=i=1k(xλi)tiAi(x)

而后化为开形式即可。注:其实就是特征根 λ i \lambda_i λi 做了分解。

1.3.2.组合计数

x x x 的指数代表着某种限制,前面的系数就变成了结果。

例1.3.2. 小明有三种物品要拿:巧克力、面包、牛奶。巧克力的数量必须是偶数,面包的数量必须是三的倍数,牛奶至少拿一个。已知小明一共拿了 10 10 10 个物品,请问可能的方案有多少种?同种物品是一模一样的。
解: 考虑三个生成函数,分别对应巧克力、面包、牛奶,用 x x x 的指数代表选择了多少个。

f 1 ( x ) = ∑ i = 0 + ∞ 2 i x 2 i = 1 + x 2 + x 4 + x 6 + x 8 + ⋯ f 2 ( x ) = ∑ i = 0 + ∞ 3 i x 3 i = 1 + x 3 + x 6 + x 9 + ⋯ f 3 ( x ) = ∑ i = 1 + ∞ i x i = x + x 2 + x 3 + x 4 + x 5 + x 6 + x 7 + x 8 + x 9 + x 10 + ⋯ ∵ f 1 ( x ) f 2 ( x ) f 3 ( x ) = x + x 2 + 2 x 3 + ⋯ + 12 x 10 + ⋯ ∴ a n s = 12 \begin{aligned} f_1(x)&=\sum_{i=0}^{+\infty}2i x^{2i}=1+x^2+x^4+x^6+x^8+\cdots\\ f_2(x)&=\sum_{i=0}^{+\infty}3i x^{3i}=1+x^3+x^6+x^9+\cdots\\ f_3(x)&=\sum_{i=1}^{+\infty}i x^i=x+x^2+x^3+x^4+x^5+x^6+x^7+x^8+x^9+x^{10}+\cdots \end{aligned}\\[2ex] \because f_1(x)f_2(x)f_3(x)=x+x^2+2x^3+\cdots+12x^{10}+\cdots\\ \therefore ans = 12 f1(x)f2(x)f3(x)=i=0+2ix2i=1+x2+x4+x6+x8+=i=0+3ix3i=1+x3+x6+x9+=i=1+ixi=x+x2+x3+x4+x5+x6+x7+x8+x9+x10+f1(x)f2(x)f3(x)=x+x2+2x3++12x10+ans=12

1.3.3.卷积优化

有时候我们会看到形如下面的式子的递推式: ∀ x ∈ [ 0 , n ) ,    A x = ∑ i = 0 x B i C x − i \forall x\in[0,n),\;A_x=\sum_{i=0}^{x}B_i C_{x-i} x[0,n),Ax=i=0xBiCxi

可以发现,将 ⟨ A ⟩ , ⟨ B ⟩ , ⟨ C ⟩ \langle A\rangle,\langle B\rangle,\langle C\rangle A,B,C 写成生成函数 f A ( x ) , f B ( x ) , f C ( x ) f_A(x),f_B(x),f_C(x) fA(x),fB(x),fC(x) ,一定有这样的关系式:

f A ( x ) ≡ f B ( x ) f C ( x ) ( m o d x n ) f_A(x)\equiv f_B(x)f_C(x)\pmod{x^{n}} fA(x)fB(x)fC(x)(modxn)

这样就可以使用 O ( n log ⁡ n ) \mathcal O(n\log n) O(nlogn) 的多项式乘法进行转移了。

1.3.4.其他

比如它与下降幂相乘,无法一一列举了。

2.指数型母函数

2.1.定义

和普通生成函数很像,只不过它的系数有一点变动: f ( x ) = ∑ i = 0 n a i x i i ! f(x)=\sum_{i=0}^{n}a_i\frac{x^i}{i!} f(x)=i=0naii!xi

2.2.性质

2.2.1.闭形式

仍然具有闭形式。众所周知,
e x = ∑ i = 0 + ∞ x i i ! e^x=\sum_{i=0}^{+\infty}\frac{x^i}{i!} ex=i=0+i!xi

于是得到一个推论 e − x = ∑ i = 0 + ∞ ( − 1 ) i x i i ! e^{-x}=\sum_{i=0}^{+\infty}(-1)^i\frac{x^i}{i!} ex=i=0+(1)ii!xi

现在我们就可以写出一部分指数级母函数的闭形式了。譬如 f ( x ) = ∑ i = 0 + ∞ 2 i x 2 i ( 2 i ) ! = e x + e − x 2 f(x)=\sum_{i=0}^{+\infty}2i\frac{x^{2i}}{(2i)!}=\frac{e^x+e^{-x}}{2} f(x)=i=0+2i(2i)!x2i=2ex+ex

以及 f ( x ) = ∑ i = 0 + ∞ ( 2 i + 1 ) x 2 i + 1 ( 2 i + 1 ) ! = e x − e − x 2 f(x)=\sum_{i=0}^{+\infty}(2i+1)\frac{x^{2i+1}}{(2i+1)!}=\frac{e^x-e^{-x}}{2} f(x)=i=0+(2i+1)(2i+1)!x2i+1=2exex

2.2.2.卷积

计算 f ( x ) , g ( x ) f(x),g(x) f(x),g(x) 这两个指数级母函数的卷积,该怎么算?答曰:硬算。
f ( x ) = ∑ i = 0 + ∞ a i x i i ! ,    g ( x ) = ∑ i = 0 + ∞ b i x i i ! f(x)=\sum_{i=0}^{+\infty}a_i\frac{x^i}{i!},\;g(x)=\sum_{i=0}^{+\infty}b_i\frac{x^i}{i!} f(x)=i=0+aii!xi,g(x)=i=0+bii!xi

⇒ f ( x ) g ( x ) = ∑ i = 0 + ∞ ∑ j = 0 i a j b i − j j ! ( i − j ) ! x i = ∑ i = 0 + ∞ ∑ j = 0 i a j b i − j ⋅ i ! j ! ( i − j ) ! ⋅ x i i ! = ∑ i = 0 + ∞ ∑ j = 0 i ( i j ) a j b i − j x i i ! \begin{aligned} \Rightarrow f(x)g(x)&=\sum_{i=0}^{+\infty}\sum_{j=0}^{i}\frac{a_j b_{i-j}}{j!(i-j)!}x^i\\ &=\sum_{i=0}^{+\infty}\sum_{j=0}^{i}a_j b_{i-j}\cdot\frac{i!}{j!(i-j)!}\cdot\frac{x^i}{i!}\\ &=\sum_{i=0}^{+\infty}\sum_{j=0}^{i}{i\choose j}a_j b_{i-j}\frac{x^i}{i!} \end{aligned} f(x)g(x)=i=0+j=0ij!(ij)!ajbijxi=i=0+j=0iajbijj!(ij)!i!i!xi=i=0+j=0i(ji)ajbiji!xi

这同时告诉我们,见到带组合数的递推式,不要用普通生成函数了,用指数型母函数。

2.3.应用

主要就应用于 排列计数 中。原理:对于一个可重集合 S S S ,如果 S S S 中有 n n n 类不同元素,个数分别为 d 1 , d 2 , d 3 , … , d n d_1,d_2,d_3,\dots,d_n d1,d2,d3,,dn ,那么将 S S S 中的元素进行排列,不同的数量为 ( ∑ i = 1 n d i ) ! ∏ i = 1 n ( d i ! ) \frac{\left(\sum_{i=1}^{n}d_i\right)!}{\prod_{i=1}^{n}(d_i!)} i=1n(di!)(i=1ndi)!

所以说,同样的,类似于普通母函数:指数代表限制,前面的系数表示方案数。

例2.3.1. 1 , 4 , 7 , 8 1,4,7,8 1,4,7,8 四个数字组成一个十位数,满足这些要求: 1 1 1 是奇数个; 4 4 4 最多出现四次; 7 , 8 7,8 7,8 都出现过。求不同的十位数的数量。
解: 使用生成函数即可。详细过程略。

例2.3.2. (复杂一点)点此跳转。

例2.3.3. n ( n ≤ 10 ) n(n\le 10) n(n10) 种物品,并且知道每种物品的数量。要求从中选出 m ( m ≤ 10 ) m(m\le 10) m(m10) 件物品的排列数。例如有两种物品 A , B A,B A,B ,并且数量都是 1 1 1 ,从中选 2 2 2 件物品,则排列有 A B AB AB B A BA BA 两种。
解: 暴力卷积即可。

#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
inline int readint(){
	int a = 0; char c = getchar(), f = 1;
	for(; c<'0' or c>'9'; c=getchar())
		if(c == '-') f = -f;
	for(; '0'<=c and c<='9'; c=getchar())
		a = (a<<3)+(a<<1)+(c^48);
	return a*f;
}
inline void writeint(long long x){
	if(x < 0) putchar('-'), x = -x;
	if(x > 9) writeint(x/10);
	putchar(x%10+'0');
}

const int MaxN = 20;
int n, m;
long long f[MaxN], tmp[MaxN], comb[MaxN][MaxN];
inline void work(int x){
	for(int i=0; i<=m; ++i) tmp[i] = 0;
	for(int i=0; i<=m; ++i)
		for(int j=0; j<=m-i and j<=x; ++j)
			tmp[i+j] += f[i]*comb[i+j][i];
	for(int i=0; i<=m; ++i) f[i] = tmp[i];
}
int main(){
	for(int i=0; i<=10; ++i)
		for(int j=(comb[i][0]=1); j<=i; ++j)
			comb[i][j] = comb[i-1][j]+comb[i-1][j-1];
	while(~scanf("%d %d",&n,&m)){
		for(int i=1; i<=m; ++i) f[i] = 0;
		f[0] = 1; // 没有物品
		for(int i=1; i<=n; ++i)
			work(min(readint(),m));
		writeint(f[m]), putchar('\n');
	}
	return 0;
}

3.深入

这一部分就拉通了来讲。因为今天的所学明显超出我原来所写的。

3.1.通项公式

例3.1.1. 求杨辉三角里 “对角线和” 的通项公式。即 a n = ∑ i = 0 n ( n + i 2 i ) a_n=\sum_{i=0}^{n}{n+i\choose 2i} an=i=0n(2in+i)
解: 利用生成函数。
A ( x ) = ∑ n = 0 + ∞ a n x n = ∑ n = 0 + ∞ x n ∑ i = 0 n ( n + i 2 i ) = ∑ n = 0 + ∞ ∑ i = 0 n ( n − i + 2 i 2 i ) x n − i ( x ) 2 i = ∑ a = 0 + ∞ ∑ 2 ∣ b ( a + b a ) x a ( x ) b \begin{aligned} A(x) &=\sum_{n=0}^{+\infty}a_nx^n\\ &=\sum_{n=0}^{+\infty}x^n\sum_{i=0}^{n}{n+i\choose 2i}\\ &=\sum_{n=0}^{+\infty}\sum_{i=0}^{n}{n-i+2i\choose 2i}x^{n-i}(\sqrt{x})^{2i}\\ &=\sum_{a=0}^{+\infty}\sum_{2|b}{a+b\choose a}x^{a}(\sqrt{x})^b \end{aligned} A(x)=n=0+anxn=n=0+xni=0n(2in+i)=n=0+i=0n(2ini+2i)xni(x )2i=a=0+2b(aa+b)xa(x )b

里面那玩意儿已经很好看了。只有一个问题就是 2 ∣ b 2|b 2b 。当然你会发现,我们 不妨扩大 b b b 的范围,最后去掉所有含有 x \sqrt{x} x 的项即可。

所以
A ( x ) ≈ ∑ a = 0 + ∞ ∑ b = 0 + ∞ ( a + b b ) x a ( x ) b = ∑ i = 0 + ∞ ( x + x ) i = 1 1 − x − x \begin{aligned} A(x) &\approx \sum_{a=0}^{+\infty} \sum_{b=0}^{+\infty} {a+b\choose b}x^a(\sqrt{x})^b\\ &=\sum_{i=0}^{+\infty}\left(x+\sqrt{x}\right)^{i}\\ &=\frac{1}{1-\sqrt{x}-x} \end{aligned} A(x)a=0+b=0+(ba+b)xa(x )b=i=0+(x+x )i=1x x1

这是斐波那契。设斐波那契母函数为 F ( x ) F(x) F(x)
A ( x 2 ) ≈ 1 1 − x − x 2 = F ( x )    ⇒ a n = fibonacci ⁡ ( 2 n ) A(x^2)\approx{1\over 1-x-x^2}=F(x)\\ \;\\\Rightarrow a_n=\operatorname{fibonacci}(2n) A(x2)1xx21=F(x)an=fibonacci(2n)

回看 A ( x ) A(x) A(x) 中多出的 x \sqrt{x} x 项,在 A ( x 2 ) A(x^2) A(x2) 里成为了 x x x 即奇数次数项。确实是比 F ( x ) F(x) F(x) 少的部分。所以 a n a_n an 是可以划等号的。

例3.2.2. 已知 C 0 = 1 ,    C n = ∑ i = 1 n C i − 1 C n − i    ( n ∈ N + ) C_0=1,\;C_n=\sum_{i=1}^{n}C_{i-1}C_{n-i}\;(n\in\N^+) C0=1,Cn=i=1nCi1Cni(nN+) ,求卡特兰数 C n C_n Cn 通项公式。
解: 不妨先用普通母函数试一试。
G ( x ) = ∑ i = 0 + ∞ C i x i = 1 + x ⋅ G ( x ) 2 ⇒ G ( x ) = 1 ± 1 − 4 x 2 x \begin{aligned} G(x) &=\sum_{i=0}^{+\infty}C_ix^i\\ &=1+x\cdot G(x)^2\\ \Rightarrow G(x)&={1\pm\sqrt{1-4x}\over 2x} \end{aligned} G(x)G(x)=i=0+Cixi=1+xG(x)2=2x1±14x

此处有两个解。我们有理由相信, G ( x ) G(x) G(x) 0 0 0 的邻域内收敛,所以 lim ⁡ x → 0 + G ( x ) = [ x 0 ] G ( x ) = 1 \lim_{x\to 0^+}G(x)=[x^0]G(x)=1 limx0+G(x)=[x0]G(x)=1,这足以帮我们排除 1 + 1 − 4 x 2 x 1+\sqrt{1-4x}\over 2x 2x1+14x 的解(其发散)。
1 − x = − 1 2 ( x − 1 ) + ∑ k ≥ 2 1 × 3 × 5 × ⋯ × ( 2 k − 3 ) k ! × ( − 2 ) k ( x − 1 ) k 1-\sqrt{x}=-\frac{1}{2}(x-1)+\sum_{k\ge 2}\frac{1\times3\times5\times\cdots\times(2k-3)}{k!\times (-2)^k}(x-1)^k 1x =21(x1)+k2k!×(2)k1×3×5××(2k3)(x1)k

此乃 x 0 = 1 x_0=1 x0=1 处泰勒展开者也。进而有
G ( x ) = 1 − 1 − 4 x 2 x = 1 + ∑ k ≥ 2 1 × 3 × 5 × ⋯ × ( 2 k − 3 ) k ! × ( − 2 ) k ⋅ ( − 4 x ) k 2 x = 1 + ∑ k ≥ 1 1 × 3 × 5 × ⋯ × ( 2 k − 1 ) ⋅ ( 2 x ) k ( k + 1 ) ! = 1 + ∑ k ≥ 1 ( 2 k ) ! 2 × 4 × 6 × ⋯ × 2 k × 2 k ⋅ x k ( k + 1 ) ! = 1 + ∑ k ≥ 1 ( 2 k ) ! k ! ⋅ x k ( k + 1 ) ! ⇒ C n = ( 2 n ) ! n ! ⋅ ( n + 1 ) ! = 1 n + 1 ( 2 n n ) ( n ∈ N ) \begin{aligned} G(x) &={1-\sqrt{1-4x}\over 2x}\\ &=1+\sum_{k\ge 2}\frac{1\times3\times5\times\cdots\times(2k-3)}{k!\times (-2)^k}\cdot {(-4x)^k\over 2x}\\ &=1+\sum_{k\ge 1}1\times 3\times5\times\cdots\times(2k-1)\cdot{(2x)^k\over (k+1)!}\\ &=1+\sum_{k\ge 1}\frac{(2k)!}{2\times4\times 6\times\cdots\times 2k}\times 2^k\cdot{x^k\over(k+1)!}\\ &=1+\sum_{k\ge 1}\frac{(2k)!}{k!}\cdot{x^k\over(k+1)!}\\ \Rightarrow C_n&=\frac{(2n)!}{n!\cdot(n+1)!}={1\over n+1}{2n\choose n}\quad(n\in \N) \end{aligned} G(x)Cn=2x114x =1+k2k!×(2)k1×3×5××(2k3)2x(4x)k=1+k11×3×5××(2k1)(k+1)!(2x)k=1+k12×4×6××2k(2k)!×2k(k+1)!xk=1+k1k!(2k)!(k+1)!xk=n!(n+1)!(2n)!=n+11(n2n)(nN)

3.2.求普通母函数

例3.2.1. 求序列 ⟨ 1 , 3 , 5 , … , 2 n − 1 , …   ⟩ \lang 1,3,5,\dots,2n-1,\dots\rang 1,3,5,,2n1, 作为系数的普通母函数闭形式。
解:
F ( x ) = ∑ i = 0 + ∞ ( 2 i + 1 ) x i = 2 ∑ i = 0 + ∞ ( i + 1 ) ⋅ x i − ∑ i = 0 + ∞ x i = 2 ∑ i = 0 + ∞ ( x i + 1 ) ′ − ∑ i = 0 + ∞ x i = 2 ( x 1 − x ) ′ − 1 1 − x = 1 + x ( 1 − x ) 2 \begin{aligned} F(x) &=\sum_{i=0}^{+\infty}(2i+1)x^i\\ &=2\sum_{i=0}^{+\infty}(i+1)\cdot x^i-\sum_{i=0}^{+\infty}x^i\\ &=2\sum_{i=0}^{+\infty}(x^{i+1})'-\sum_{i=0}^{+\infty}x^i\\ &=2\left(\frac{x}{1-x}\right)'-\frac{1}{1-x}\\ &=\frac{1+x}{(1-x)^2} \end{aligned} F(x)=i=0+(2i+1)xi=2i=0+(i+1)xii=0+xi=2i=0+(xi+1)i=0+xi=2(1xx)1x1=(1x)21+x

从中我们看出一个事实,将系数写成下降幂,变成导数即可计算。

3.3.求指数型母函数

例3.3.1. 求圆排列 c ^ 0 = 0 ,    c ^ n = ( n − 1 ) !    ( n ∈ N + ) \hat c_0=0,\;\hat c_n=(n-1)!\;(n\in\N^+) c^0=0,c^n=(n1)!(nN+) 的指数型母函数。注:圆排列也是求本质不同排列数,但是它认为循环移位本质相同。
解: 根据定义
C ^ ( x ) = ∑ n = 1 + ∞ c ^ n x n n ! = ∑ n = 1 + ∞ x n n = − ln ⁡ ( 1 − x ) = ln ⁡ ( 1 1 − x ) \begin{aligned} \hat C(x) &=\sum_{n=1}^{+\infty}\hat c_n{x^n\over n!}\\ &=\sum_{n=1}^{+\infty}{x^n\over n}\\ &=-\ln(1-x)\\ &=\ln\left({1\over 1-x}\right) \end{aligned} C^(x)=n=1+c^nn!xn=n=1+nxn=ln(1x)=ln(1x1)

这个简单。突然你发现了梦幻联动,如果你写出全排 p n = n ! p_n=n! pn=n! 的指数型生成函数 P ( x ) = 1 1 − x P(x)=\frac{1}{1-x} P(x)=1x1 竟然有
P ( x ) = e C ^ ( x ) = ∑ k = 0 + ∞ C ^ ( x ) k k ! P(x)=e^{\hat C(x)}=\sum_{k=0}^{+\infty}\frac{\hat C(x)^k}{k!} P(x)=eC^(x)=k=0+k!C^(x)k

仔细想想,确实合理。把一个全排看成置换,会得到很多个环。我们枚举环的大小。则
p n = ∑ 1 ≤ x 1 ≤ x 2 ≤ x 3 ≤ ⋯ ≤ x k x 1 + x 2 + x 3 + ⋯ + x k = n ( n x 1 ) c ^ x 1 ( n − x 1 x 2 ) c ^ x 2 ⋯ ( x k x k ) c ^ x k p_n=\sum_{1\le x_1\le x_2\le x_3\le\cdots\le x_k}^{x_1+x_2+x_3+\cdots+x_k=n} {n\choose x_1}\hat c_{x_1}{n-x_1\choose x_2}{\hat c_{x_2}}\cdots{x_k\choose x_k}\hat c_{x_k} pn=1x1x2x3xkx1+x2+x3++xk=n(x1n)c^x1(x2nx1)c^x2(xkxk)c^xk

如果不让 x x x 有序,那就需要乘一个 1 k ! \frac{1}{k!} k!1 的系数。至于组合数,恰好是指数型母函数卷积所附加的系数。所以真的是卷积。

例3.3.2. 求错排 d 1 = 0 ,    d 2 = 1 ,    d n = ( n − 1 ) ( d n − 1 + d n − 2 )    ( n ≥ 3 ) d_1=0,\;d_2=1,\;d_n=(n-1)(d_{n-1}+d_{n-2})\;(n\ge 3) d1=0,d2=1,dn=(n1)(dn1+dn2)(n3) 的指数型生成函数 D ( x ) D(x) D(x) 的闭形式。
解: 错排的本质是,不存在自环的一种排列。稍微改动一下上面的式子即可。
d n = ∑ 2 ≤ x 1 ≤ x 2 ≤ x 3 ≤ ⋯ ≤ x k x 1 + x 2 + x 3 + ⋯ + x k = n ( n x 1 ) c ^ x 1 ( n − x 1 x 2 ) c ^ x 2 ⋯ ( x k x k ) c ^ x k d_n=\sum_{2\le x_1\le x_2\le x_3\le\cdots\le x_k}^{x_1+x_2+x_3+\cdots+x_k=n} {n\choose x_1}\hat c_{x_1}{n-x_1\choose x_2}{\hat c_{x_2}}\cdots{x_k\choose x_k}\hat c_{x_k} dn=2x1x2x3xkx1+x2+x3++xk=n(x1n)c^x1(x2nx1)c^x2(xkxk)c^xk

类似的,令
C ( x ) = ∑ i = 2 + ∞ c ^ i x i = ln ⁡ ( 1 1 − x ) − c ^ 1 x C(x)=\sum_{i=2}^{+\infty}\hat c_ix^i=\ln\left({1\over 1-x}\right)-\hat c_1x C(x)=i=2+c^ixi=ln(1x1)c^1x


D ( x ) = ∑ i = 0 + ∞ C ( x ) i i ! = exp ⁡ [ C ( x ) ] = e − x 1 − x \begin{aligned} D(x) &=\sum_{i=0}^{+\infty}\frac{C(x)^i}{i!}\\ &=\operatorname{exp}\big[C(x)\big]\\ &={e^{-x}\over 1-x} \end{aligned} D(x)=i=0+i!C(x)i=exp[C(x)]=1xex

当然啦,也可以直接利用通项公式(容斥式)得到该式子。因为 1 1 − x \frac{1}{1-x} 1x1 是全排而 e − x e^{-x} ex ( − 1 ) i (-1)^i (1)i 的指数型母函数。
d n = ∑ i = 0 n ( − 1 ) i ( n i ) ( n − i ) ! d_n=\sum_{i=0}^{n}(-1)^i{n\choose i}(n-i)! dn=i=0n(1)i(in)(ni)!

例3.3.3. n n n 个点有标号无向连通图个数 a n a_n an 的指数型生成函数 F ( x ) F(x) F(x)
解: 首先考虑可以不连通的情况。显然方案数 b n = 2 n ( n − 1 ) b_n=\sqrt{2^{n(n-1)}} bn=2n(n1) 即枚举每条边。然而它有另一种计算方法,即枚举连通块大小。类似上面的操作,可得
e A ( x ) = B ( x ) ⇒ A ( x ) = ln ⁡ B ( x ) \begin{aligned} e^{A(x)}&=B(x)\\ \Rightarrow A(x)&=\ln B(x) \end{aligned} eA(x)A(x)=B(x)=lnB(x)

手推易知 B ( x ) B(x) B(x) 没有闭形式。所以只能暴力算对数了。但是复杂度确为 O ( n log ⁡ n ) \mathcal O(n\log n) O(nlogn)

例子很多,我就不放上来了。更多学习资料就去分类专栏里找吧。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值