组合数学

14 minIntermediate2026/6/14

基本计数原理、排列与组合、容斥原理、鸽巢原理、递推关系、生成函数、Catalan数、Stirling数。

1. 基本计数原理

1.1 加法原理

若完成一件事有 nn 方法,第 ii mim_i 种方法,各方法互不相容,则完成该事共有 m1+m2++mnm_1 + m_2 + \cdots + m_n 种方法。

1.2 乘法原理

若完成一件事需 nn 个步骤,第 ii 步有 mim_i 种方法,则完成该事共有 m1×m2××mnm_1 \times m_2 \times \cdots \times m_n 种方法。

:从 A 到 B 有3条路,从 B 到 C 有4条路,从 A 经 B 到 C 有 3×4=123 \times 4 = 12 种走法。

2. 排列与组合

2.1 排列

无重复排列:从 nn 个不同元素中取 rr 个排列:

P(n,r)=n!(nr)!P(n, r) = \frac{n!}{(n-r)!}

全排列P(n,n)=n!P(n, n) = n!

有重复排列:从 nn 个不同元素中取 rr 个(允许重复)排列:nrn^r

圆排列nn 个不同元素的圆排列数:(n1)!(n-1)!

2.2 组合

无重复组合:从 nn 个不同元素中取 rr 个:

(nr)=C(n,r)=n!r!(nr)!\binom{n}{r} = C(n, r) = \frac{n!}{r!(n-r)!}

多重组合(可重复组合):从 nn 种元素中取 rr 个(允许重复):

(n+r1r)=(n+r1n1)\binom{n+r-1}{r} = \binom{n+r-1}{n-1}

:将10个相同的球放入3个不同的盒子,有多少种方法?

可重复组合:(10+3110)=(1210)=66\binom{10+3-1}{10} = \binom{12}{10} = 66

2.3 组合恒等式

Pascal 恒等式(nr)=(n1r1)+(n1r)\binom{n}{r} = \binom{n-1}{r-1} + \binom{n-1}{r}

二项式定理(x+y)n=k=0n(nk)xkynk(x+y)^n = \sum_{k=0}^{n} \binom{n}{k} x^k y^{n-k}

特殊值

  • k=0n(nk)=2n\sum_{k=0}^{n} \binom{n}{k} = 2^n
  • k=0n(1)k(nk)=0\sum_{k=0}^{n} (-1)^k \binom{n}{k} = 0
  • k=0n(nk)2=(2nn)\sum_{k=0}^{n} \binom{n}{k}^2 = \binom{2n}{n}(Vandermonde 恒等式的特例)

Vandermonde 恒等式(m+nr)=k=0r(mk)(nrk)\binom{m+n}{r} = \sum_{k=0}^{r} \binom{m}{k}\binom{n}{r-k}

2.4 多重集的排列

设多重集 S={n1a1,n2a2,,nkak}S = \{n_1 \cdot a_1, n_2 \cdot a_2, \ldots, n_k \cdot a_k\}n=n1+n2++nkn = n_1 + n_2 + \cdots + n_k,则全排列数为:

n!n1!n2!nk!\frac{n!}{n_1! \cdot n_2! \cdots n_k!}

:MISSISSIPPI 的字母排列数。

M:1M:1, I:4I:4, S:4S:4, P:2P:2,共11个字母。 11!1!4!4!2!=34650\frac{11!}{1! \cdot 4! \cdot 4! \cdot 2!} = 34650

3. 容斥原理

3.1 两集合

AB=A+BAB|A \cup B| = |A| + |B| - |A \cap B|

3.2 三集合

ABC=A+B+CABACBC+ABC|A \cup B \cup C| = |A| + |B| + |C| - |A \cap B| - |A \cap C| - |B \cap C| + |A \cap B \cap C|

3.3 一般形式

i=1nAi=iAii<jAiAj+i<j<kAiAjAk+(1)n+1A1An\left|\bigcup_{i=1}^{n} A_i\right| = \sum_{i}|A_i| - \sum_{i<j}|A_i \cap A_j| + \sum_{i<j<k}|A_i \cap A_j \cap A_k| - \cdots + (-1)^{n+1}|A_1 \cap \cdots \cap A_n|

3.4 错排问题

nn 个元素的错排(derangement)数:

Dn=n!(111!+12!+(1)n1n!)=n!k=0n(1)kk!D_n = n!\left(1 - \frac{1}{1!} + \frac{1}{2!} - \cdots + (-1)^n \frac{1}{n!}\right) = n!\sum_{k=0}^{n}\frac{(-1)^k}{k!}

:4个人的帽子全戴错的方案数。

D4=4!(11+1216+124)=24924=9D_4 = 4!(1 - 1 + \frac{1}{2} - \frac{1}{6} + \frac{1}{24}) = 24 \cdot \frac{9}{24} = 9

3.5 Euler 函数

不超过 nn 且与 nn 互素的正整数个数:

φ(n)=npn(11p)\varphi(n) = n\prod_{p \mid n}\left(1 - \frac{1}{p}\right)

其中 pp 取遍 nn 的所有不同素因子。

φ(12)=12(112)(113)=121223=4\varphi(12) = 12(1 - \frac{1}{2})(1 - \frac{1}{3}) = 12 \cdot \frac{1}{2} \cdot \frac{2}{3} = 4

4. 鸽巢原理

4.1 基本形式

n+1n+1 个物品放入 nn 个盒子,至少有一个盒子包含至少2个物品。

4.2 加强形式

nn 个物品放入 kk 个盒子,则至少有一个盒子包含至少 n/k\lceil n/k \rceil 个物品。

4.3 应用

:在任意 n+1n+1 个正整数中,必有两个数之差是 nn 的倍数。

考虑这 n+1n+1 个数除以 nn 的余数,余数只有 0,1,,n10, 1, \ldots, n-1nn 种,由鸽巢原理,必有两个数余数相同,其差是 nn 的倍数。

:在边长为1的正三角形中任取5个点,必有两点距离不超过 12\frac{1}{2}

将正三角形分为4个边长为 12\frac{1}{2} 的小正三角形,5个点放入4个区域,必有2个在同一区域,距离不超过 12\frac{1}{2}

5. 递推关系

5.1 常系数线性齐次递推

an+c1an1+c2an2++ckank=0a_n + c_1 a_{n-1} + c_2 a_{n-2} + \cdots + c_k a_{n-k} = 0

特征方程xk+c1xk1++ck=0x^k + c_1 x^{k-1} + \cdots + c_k = 0

求解

  • 单根 rr:贡献 ArnA r^n
  • mm 重根 rr:贡献 (A0+A1n++Am1nm1)rn(A_0 + A_1 n + \cdots + A_{m-1} n^{m-1}) r^n

:Fibonacci 数列 Fn=Fn1+Fn2F_n = F_{n-1} + F_{n-2}F0=0F_0 = 0F1=1F_1 = 1

特征方程:x2x1=0x^2 - x - 1 = 0x=1±52x = \frac{1 \pm \sqrt{5}}{2}Fn=15[(1+52)n(152)n]F_n = \frac{1}{\sqrt{5}}\left[\left(\frac{1+\sqrt{5}}{2}\right)^n - \left(\frac{1-\sqrt{5}}{2}\right)^n\right]

5.2 常系数线性非齐次递推

an+c1an1++ckank=f(n)a_n + c_1 a_{n-1} + \cdots + c_k a_{n-k} = f(n)

通解 = 齐次通解 + 非齐次特解

特解形式取决于 f(n)f(n)

f(n)f(n)特解形式
cc(常数)AA
cndcn^dA0+A1n++AdndA_0 + A_1 n + \cdots + A_d n^d
crnc \cdot r^nArnA r^nrr 不是特征根)
crnc \cdot r^nAnrnAn r^nrr 是单特征根)

6. 生成函数

6.1 定义

序列 {an}\{a_n\}普通生成函数

G(x)=n=0anxnG(x) = \sum_{n=0}^{\infty} a_n x^n

6.2 常用生成函数

序列生成函数
(nk)\binom{n}{k}(1+x)n(1+x)^n
1,1,1,1, 1, 1, \ldots11x\frac{1}{1-x}
1,1,1,1,1, -1, 1, -1, \ldots11+x\frac{1}{1+x}
0,1,2,3,0, 1, 2, 3, \ldotsx(1x)2\frac{x}{(1-x)^2}
(n+k1k)\binom{n+k-1}{k}1(1x)n\frac{1}{(1-x)^n}

6.3 应用

:用1元、2元、5元硬币凑出 nn 元的方案数。

生成函数: G(x)=11x11x211x5G(x) = \frac{1}{1-x} \cdot \frac{1}{1-x^2} \cdot \frac{1}{1-x^5} ana_nG(x)G(x) 展开式中 xnx^n 的系数。

6.4 指数生成函数

E(x)=n=0anxnn!E(x) = \sum_{n=0}^{\infty} a_n \frac{x^n}{n!}

适用于排列计数问题。

序列指数生成函数
1,1,1,1, 1, 1, \ldotsexe^x
P(n,k)P(n, k)(1+x)n(1+x)^n
1,0,1,0,1, 0, 1, 0, \ldotscoshx\cosh x
0,1,0,1,0, 1, 0, 1, \ldotssinhx\sinh x

7. Catalan 数

7.1 定义

Cn=1n+1(2nn)=(2n)!(n+1)!n!C_n = \frac{1}{n+1}\binom{2n}{n} = \frac{(2n)!}{(n+1)!n!}

前几项:C0=1,C1=1,C2=2,C3=5,C4=14,C5=42C_0 = 1, C_1 = 1, C_2 = 2, C_3 = 5, C_4 = 14, C_5 = 42

7.2 递推关系

Cn=i=0n1CiCn1i,C0=1C_n = \sum_{i=0}^{n-1} C_i C_{n-1-i}, \quad C_0 = 1

7.3 组合意义

CnC_n 计数的问题:

  1. nn 对括号的合法匹配数
  2. n+1n+1 个矩阵连乘的加括号方式数
  3. (0,0)(0,0)(n,n)(n,n) 不越过对角线的路径数
  4. nn 个节点的不同二叉搜索树个数
  5. n+2n+2 边形的三角剖分数
  6. 栈的合法出栈序列数

:3对括号的合法匹配:C3=5C_3 = 5 种。

((())), (()()), (())(), ()(()), ()()()

7.4 生成函数

C(x)=n=0Cnxn=114x2xC(x) = \sum_{n=0}^{\infty} C_n x^n = \frac{1 - \sqrt{1-4x}}{2x}

8. Stirling 数

8.1 第一 Stirling 数

s(n,k)s(n, k):将 nn 个不同元素排成 kk 个非空轮换的方案数。

递推

s(n,k)=s(n1,k1)+(n1)s(n1,k)s(n, k) = s(n-1, k-1) + (n-1) \cdot s(n-1, k)

边界s(0,0)=1s(0,0) = 1s(n,0)=0s(n,0) = 0n>0n > 0),s(n,n)=1s(n,n) = 1

与阶乘的关系

xn=x(x1)(x2)(xn+1)=k=0ns(n,k)xkx^{\underline{n}} = x(x-1)(x-2)\cdots(x-n+1) = \sum_{k=0}^{n} s(n,k) x^k

8.2 第二 Stirling 数

S(n,k)S(n, k):将 nn 个不同元素分成 kk 个非空子集的方案数。

递推

S(n,k)=S(n1,k1)+kS(n1,k)S(n, k) = S(n-1, k-1) + k \cdot S(n-1, k)

边界S(0,0)=1S(0,0) = 1S(n,0)=0S(n,0) = 0n>0n > 0),S(n,n)=1S(n,n) = 1S(n,1)=1S(n,1) = 1

与幂的关系

xn=k=0nS(n,k)xkx^n = \sum_{k=0}^{n} S(n,k) x^{\underline{k}}

显式公式

S(n,k)=1k!j=0k(1)kj(kj)jnS(n, k) = \frac{1}{k!}\sum_{j=0}^{k} (-1)^{k-j} \binom{k}{j} j^n

S(4,2)=7S(4, 2) = 7

4个元素分成2个非空子集:{1}{2,3,4}\{1\}\{2,3,4\}, {2}{1,3,4}\{2\}\{1,3,4\}, {3}{1,2,4}\{3\}\{1,2,4\}, {4}{1,2,3}\{4\}\{1,2,3\}, {1,2}{3,4}\{1,2\}\{3,4\}, {1,3}{2,4}\{1,3\}\{2,4\}, {1,4}{2,3}\{1,4\}\{2,3\}

8.3 Bell 数

Bn=k=0nS(n,k)B_n = \sum_{k=0}^{n} S(n, k)

BnB_nnn 个元素的划分总数。

前几项:B0=1,B1=1,B2=2,B3=5,B4=15,B5=52B_0 = 1, B_1 = 1, B_2 = 2, B_3 = 5, B_4 = 15, B_5 = 52

递推Bn+1=k=0n(nk)BkB_{n+1} = \sum_{k=0}^{n} \binom{n}{k} B_k

指数生成函数n=0Bnxnn!=eex1\sum_{n=0}^{\infty} B_n \frac{x^n}{n!} = e^{e^x - 1}