- 本系列,主要是学习《组合数学》(《
I
n
t
r
o
d
u
c
t
o
r
y
C
o
m
b
i
n
a
t
o
r
i
c
s
Introductory\ Combinatorics
Introductory Combinatorics》)原书第五版
精简整理内容
组合数学的引入
- 组合数学所关心的问题:排列的存在性、排列的列举或分类、研究已知的排列、构造最优排列
棋盘的完美覆盖
-
n
×
m
n\times m
n×m 是否能被
1
×
b
1\times b
1×b 的骨牌完美覆盖?
当且仅当 b b b 是 n n n 的因子或者是 m m m 的因子
b = 2 b=2 b=2 时,方案数有 F i s c h e r Fischer Fischer 公式,包含三角函数
相互重叠的圆
- 平面上以普通位置相互重叠的
n
n
n 个圆的划分区域数:
h
n
=
n
2
−
n
+
2
h_n=n^2-n+2
hn=n2−n+2
考虑已有 n − 1 n-1 n−1 个圆,划分数为 h n − 1 h_{n-1} hn−1
第 n n n 个圆与其他 n − 1 n-1 n−1 个圆,每个圆都有两个交点,连续的两个交点划分一个圆弧,即多一个区域
于是 h n = h n − 1 + 2 ( n − 1 ) h_n=h_{n-1}+2(n-1) hn=hn−1+2(n−1),且容易得到 h 1 = 2 h_1=2 h1=2
通过反复递推法,可以得到:
h n = h n − 1 + 2 ( n − 1 ) h n = h n − 2 + 2 ( n − 2 ) + 2 ( n − 1 ) ⋮ h n = h 1 + 2 ( 1 ) + 2 ( 2 ) + ⋯ + 2 ( n − 1 ) \begin{aligned} h_n&=h_{n-1}+2(n-1)\\ h_n&=h_{n-2}+2(n-2)+2(n-1)\\ \vdots\\ h_n&=h_1+2(1)+2(2)+\cdots+2(n-1) \end{aligned} hnhn⋮hn=hn−1+2(n−1)=hn−2+2(n−2)+2(n−1)=h1+2(1)+2(2)+⋯+2(n−1)
排列与组合
四个基本的计数原理
- 加法原理:
S
1
,
S
2
,
⋯
,
S
k
S_1,S_2,\cdots,S_k
S1,S2,⋯,Sk 是
S
S
S 的一个划分,那么:
∣ S ∣ = ∑ i = 1 k ∣ S i ∣ |S|=\sum_{i=1}^k |S_i| ∣S∣=i=1∑k∣Si∣ - 乘法原理:
S
S
S 是有序对
(
a
,
b
)
(a,b)
(a,b) 的集合,
a
a
a 来自一个大小为
p
p
p 的集合,
b
b
b 来自一个大小为
q
q
q 的集合,则:
∣ S ∣ = p × q |S|=p\times q ∣S∣=p×q - 减法原理:
A
A
A 是一个集合,
U
U
U 是
A
A
A 的超集,设
A
ˉ
=
U
\
A
\bar{A}=U\backslash A
Aˉ=U\A ,称
A
ˉ
\bar{A}
Aˉ 是
A
A
A 在
U
U
U 中的补,则:
∣ A ∣ = ∣ U ∣ − ∣ A ˉ ∣ |A|=|U|-|\bar{A}| ∣A∣=∣U∣−∣Aˉ∣
例子:长度为 6 6 6 的包含 0 ∼ 9 , a ∼ z 0\sim9,a\sim z 0∼9,a∼z 的字符串,有多少种是有重复字符的字符串?
∣ U ∣ = 3 6 6 |U|=36^6 ∣U∣=366
设 ∣ A ∣ |A| ∣A∣ 表示有重复字符的字符串的个数; ∣ A ˉ ∣ |\bar{A}| ∣Aˉ∣ 表示没有重复字符的字符串的个数
则: ∣ A ˉ ∣ = P 36 6 |\bar{A}|=P_{36}^6 ∣Aˉ∣=P366
且 ∣ A ∣ = ∣ U ∣ − ∣ A ˉ ∣ |A|=|U|-|\bar{A}| ∣A∣=∣U∣−∣Aˉ∣,直接得到了 - 除法原理:令
S
S
S 是一个有限集合,把它划分成
k
k
k 个部分使得每一个部分包含的对象数目相同,此划分中的部分的数目:
k = ∣ S ∣ 在 一 个 部 分 中 的 对 象 数 目 k=\frac{|S|}{在一个部分中的对象数目} k=在一个部分中的对象数目∣S∣
例子: 740 740 740 只鸽子,每个鸽巢有 5 5 5 只鸽子,那么鸽巢数目为 740 5 = 148 \frac{740}{5}=148 5740=148 - 多重集合的表示: { 2 ⋅ a , 3 ⋅ b , ∞ ⋅ c } \{2\cdot a,3\cdot b,\infin \cdot c\} {2⋅a,3⋅b,∞⋅c} 或者使用有序对来指明 { ( 2 , a ) , ( 3 , b ) , ( ∞ , 5 ) } \{(2,a),(3,b),(\infin,5)\} {(2,a),(3,b),(∞,5)}
- 计数:优先选择约束性最强的选择
例子: 0 ∼ 10000 0\sim 10000 0∼10000 之间有多少个整数恰好有一位数字是 5 5 5 ?
解一:枚举整数的位数,分类讨论,然后加法原理做。
解二:枚举 5 5 5 的位置,通过添加前导零可以把每个数字都看作是四位数,其他三位方案数是 9 3 9^3 93,于是总的方案数就是: 4 × 9 3 4\times 9^3 4×93
集合的排列
-
P
(
n
,
r
)
P(n,r)
P(n,r) 表示
n
n
n 元素集合的
r
r
r 排列的数目
P ( n , r ) = n ! ( n − r ) ! P(n,r)=\frac{n!}{(n-r)!} P(n,r)=(n−r)!n!
例子: 26 26 26 个字母排序,元音字母中任意两个都不能连续出现的方案数?
解:使用插空法。首先排列辅音字母,然后有 22 22 22 个空,选择 5 5 5 个插入元音字母即可,方案数为:
21 ! × P ( 22 , 5 ) 21!\times P(22,5) 21!×P(22,5)
上述表述都是线性排列 - 圆排列 ,即
n
n
n 元素集合的循环
r
r
r 排列的数目:
P ( n , r ) r = n ! r ( n − r ) ! \frac{P(n,r)}{r}=\frac{n!}{r(n-r)!} rP(n,r)=r(n−r)!n!
例子: 10 10 10 个人围一圆桌,其中两个人不愿彼此挨着的方案数?
解一:用减法原理做,全集方案数就是 9 ! 9! 9!,挨着的方案数就是 2 × 8 ! 2\times 8! 2×8!
解二:固定 P 1 P_1 P1 为桌头,因为 P 2 P_2 P2 不能和 P 1 P_1 P1 相连,所以 P 1 P_1 P1 左边的人选有 8 8 8 个,右边的人选有 7 7 7 个,其他的 7 7 7 个人就是全排列了,方案数为: 8 × 7 × 7 ! 8\times 7\times 7! 8×7×7!
集合的组合(子集)
-
S
S
S 的一个组合就是
S
S
S 的子集的一个选择。
术语组合和子集本质上可以互换,除非强调选择的过程。
我们使用 C n r C_n^r Cnr 表示 n n n 元素的 r r r 子集的数目
当然也可以使用 n C r _nC_r nCr 或者 ( r n ) \Big(_r^n\Big) (rn) 或者
( n r ) \begin{pmatrix} n\\r \end{pmatrix} (nr)
最后一种写法更正式,后文都简记为 C n r C_n^r Cnr - 对于
0
≤
r
≤
n
0\le r\le n
0≤r≤n,有
P n r = r ! C n r C n r = n ! r ! ( n − r ) ! P_n^r=r!C_n^r\\ C_n^r=\frac{n!}{r!(n-r)!} Pnr=r!CnrCnr=r!(n−r)!n!
例子:平面上 25 25 25 个点,没有三点共线,确定多少条直线?确定多少个三角形?
解:直线个数为 C 25 2 C_{25}^2 C252 ,三角形个数为 C 25 3 C_{25}^3 C253 - 推论:对于
0
≤
r
≤
n
0\le r\le n
0≤r≤n,有
C n r = C n n − r C_n^r=C_n^{n-r} Cnr=Cnn−r - 定理(帕斯卡公式): 对于所有满足
1
≤
k
≤
n
−
1
1\le k\le n-1
1≤k≤n−1的整数
n
,
k
n,k
n,k,有
C n k = C n − 1 k + C n − 1 k − 1 C_n^k=C_{n-1}^k+C_{n-1}^{k-1} Cnk=Cn−1k+Cn−1k−1
组合推理证明:把有 n n n 个元素的集合 S S S 的 k k k 子集划分成两个集合 A , B A,B A,B,指定其中一个元素为 x x x ,其中 A A A 集合都包含 x x x, B B B 集合都不包含 x x x 集合,根据加法原理,有
C n k = ∣ A ∣ + ∣ B ∣ = C n − 1 k + C n − 1 k − 1 C_n^k=|A|+|B|=C_{n-1}^k+C_{n-1}^{k-1} Cnk=∣A∣+∣B∣=Cn−1k+Cn−1k−1 - 定理:对于
n
≥
0
n\ge 0
n≥0,有
∑ i = 0 n C n i = 2 n \sum_{i=0}^n C_n^i=2^n i=0∑nCni=2n
多重集合的排列
- 设 S S S 是一个多重集合,那么 S S S 的一个 r r r 排列是 S S S 中 r r r 个对象的一个有序放置。
- 定理:设 S S S 有 k k k 种不同类型对象的多重集合,每一个元素都有无限重复数,那么 S S S 的 r r r 排列的数目是 k r k^r kr
- 定理:设
S
S
S 是一个多重集合,有
k
k
k 种不同类型的对象且第
i
i
i 种类型的有限重复数为
n
i
n_i
ni。设集合的大小为
n
=
∑
n
i
n=\sum n_i
n=∑ni,则
S
S
S 的排列数目为
n ! ∏ i = 1 k ( n i ! ) \frac{n!}{\prod_{i=1}^k (n_i!)} ∏i=1k(ni!)n!
证明:我们先考虑第一种元素的排列,方案数为 C n n 1 C_n^{n_1} Cnn1
第二种元素的排列的方案数为 C n − n 1 n 2 C_{n-n_1}^{n_2} Cn−n1n2
⋮ \vdots ⋮
上面的方案数等于
n ! n 1 ! ( n − n 1 ) ! ⋅ ( n − n 1 ) ! ( n − n 1 − n 2 ) ! ⋅ ( n − n 1 − n 2 ) ! n 3 ! ( n − n 1 − n 2 − n 3 ) ! ⋯ ( n − n 1 − n 2 ⋯ − n k − 1 ) ! n k ! ( n − n 1 − n 2 ⋯ − n k ) ! \frac{n!}{n_1!(n-n_1)!}\cdot \frac{(n-n_1)!}{(n-n_1-n_2)!}\cdot\frac{(n-n_1-n_2)!}{n_3!(n-n_1-n_2-n_3)!}\cdots \frac{(n-n_1-n_2\cdots -n_{k-1})!}{n_k!(n-n_1-n_2\cdots-n_k)!} n1!(n−n1)!n!⋅(n−n1−n2)!(n−n1)!⋅n3!(n−n1−n2−n3)!(n−n1−n2)!⋯nk!(n−n1−n2⋯−nk)!(n−n1−n2⋯−nk−1)!
化简即可得到上述式子。
第二种解释:令 n = n 1 + n 2 + ⋯ n k n=n_1+n_2+\cdots n_k n=n1+n2+⋯nk ,现在问把 n n n 个球放进 k k k 个不同的盒子,第 i i i 个盒子放 n i n_i ni 个球的方案数。 - 例子:
8
×
8
8\times8
8×8 的棋盘上放
8
8
8 个非攻击型车的方案数?
我们记录车的坐标,相当于是 ( 1 , j 1 ) , ( 2 , j 2 ) ⋯ ( 8 , j 8 ) (1,j_1),(2,j_2)\cdots(8,j_8) (1,j1),(2,j2)⋯(8,j8)
其中 j 1 ∼ j 8 j_1\sim j_8 j1∼j8 是 1 ∼ 8 1\sim8 1∼8 的一个全排列
于是方案数为 8 ! 8! 8!
前面是假设车之间是没有区别的 - 例子:
n
×
n
n\times n
n×n 的棋盘上放
n
n
n 个非攻击型车,且车有
k
k
k 种颜色,第
i
i
i 有
n
i
n_i
ni 种的方案数?
颜色相当于是一个多重集排列,所以方案数为 n ! n ! ∏ n i n!\frac{n!}{\prod n_i} n!∏nin!
多重集合的组合
- 设 S S S 是多重集合, S S S 的 r r r 组合是 S S S 中的 r r r 个对象的无需选择,是一个多重 r r r 子集。我们通常说多重集合的组合而不是多重子集。
- 定理:设
S
S
S 是有
k
k
k 种类型对象的多重集合,每种元素均有无限重复数,那么
S
S
S 的
r
r
r 组合的个数等于
C r + k − 1 r = C r + k − 1 k − 1 C_{r+k-1}^r=C_{r+k-1}^{k-1} Cr+k−1r=Cr+k−1k−1
证明: S = { ∞ ⋅ a 1 , ∞ ⋅ a 2 , ⋯ , ∞ ⋅ a k } S=\{\infin \cdot a_1,\infin \cdot a_2,\cdots ,\infin \cdot a_k\} S={∞⋅a1,∞⋅a2,⋯,∞⋅ak}
S S S 的任意 r r r 组合均呈 { x 1 ⋅ a 1 , x 2 ⋅ a 2 , ⋯ , x n ⋅ a k } \{x_1\cdot a_1,x_2\cdot a_2,\cdots, x_n\cdot a_k\} {x1⋅a1,x2⋅a2,⋯,xn⋅ak} 的形式
容易得到 x 1 + x 2 + ⋯ + x k = r x_1+x_2+\cdots+x_k=r x1+x2+⋯+xk=r 的非负整数序列 x 1 , x 2 ⋯ , x k x_1,x_2\cdots,x_k x1,x2⋯,xk 对应 S S S 的一个 r r r 组合
问题就相当于方程
x 1 + x 2 + ⋯ + x k = r x_1+x_2+\cdots+x_k=r x1+x2+⋯+xk=r
的解的个数,其中 x i x_i xi 是非负整数
我们使用 隔板法,相当于有 r r r 个 1 1 1 ,我们使用 k − 1 k-1 k−1 个挡板( k − 1 k-1 k−1 个 0 0 0)就可以划分出 k k k 个集合了
问题就转化为 r r r 个 1 1 1 , k − 1 k-1 k−1 个 0 0 0 的多重集合的排列数,容易得到为 ( r + k − 1 ) ! r ! ( k − 1 ) ! = C r + k − 1 r \frac{(r+k-1)!}{r!(k-1)!}=C_{r+k-1}^r r!(k−1)!(r+k−1)!=Cr+k−1r - 例子:
8
8
8 种面包,数量充足,一盒装
12
12
12 个面包的方案数?
解:相当于是 8 8 8 种类型的多重集合的 12 12 12 组合数,就是
C 8 + 12 − 1 12 C_{8+12-1}^{12} C8+12−112 - 例子:长度为
r
r
r,每项为
1
∼
k
1\sim k
1∼k 的非递减序列的个数是多少?
解:相当于在 1 ∼ k 1\sim k 1∼k 的无限多重集合中选取 r r r 个数字,然后再非递减排序之后得到,就是
C k + r − 1 r C_{k+r-1}^{r} Ck+r−1r - 例子:
x
1
+
x
2
+
x
3
+
x
4
=
20
x_1+x_2+x_3+x_4=20
x1+x2+x3+x4=20,且满足
{ x 1 ≥ 3 x 2 ≥ 1 x 3 ≥ 0 x 4 ≥ 5 \begin{cases} x_1\ge 3\\ x_2\ge 1\\ x_3\ge 0\\ x_4\ge 5 \end{cases} ⎩⎪⎪⎪⎨⎪⎪⎪⎧x1≥3x2≥1x3≥0x4≥5
的整数解的个数是多少?
解:我们令 y 1 = x 1 − 3 , y 2 = x 2 − 1 , y 3 = x 2 , y 4 = x 4 − 5 y_1=x_1-3,y_2=x_2-1,y_3=x_2,y_4=x_4-5 y1=x1−3,y2=x2−1,y3=x2,y4=x4−5
此时方程变为: y 1 + y 2 + y 3 + y 4 = 11 y_1+y_2+y_3+y_4=11 y1+y2+y3+y4=11
容易得到方案数为 C 4 + 11 − 1 11 C_{4+11-1}^{11} C4+11−111