组合数学详解

组合数学

1 基本概念

1. 加法原理和乘法原理

有4个基本的计数原理:加法原理、乘法原理、除法原理、减法原理。下面介绍加法原理和乘法原理。
(1) 加法原理:设集合S划分为 S 1 , S 2 , ⋯   , S m S_{1},S_{2},\cdots,S_{m} S1,S2,,Sm,则S的元素个数可以通过找出它的每部分元素的个数来确定,即 ∣ S ∣ = ∣ S 1 ∣ + ∣ S 2 ∣ + ⋯ + ∣ S m ∣ |S| = |S_{1}| + |S_{2}| + \cdots + |S_{m}| S=S1+S2++Sm 。通俗地说,一件事可以用 m m m类不同的方法完成,其中第 i i i类有 a i a_{i} ai种不同的方法,则总方法数为 a 1 + a 2 + ⋯ + a m a_{1}+a_{2}+\cdots+a_{m} a1+a2++am 。加法原理是全体等于部分和的公式化描述。在加法原理中,如果集合 S 1 , S 2 , ⋯   , S m S_{1},S_{2},\cdots,S_{m} S1,S2,,Sm可以重叠,就是容斥原理。
(2) 乘法原理:令S是元素的序偶 ( a , b ) (a, b) (a,b)的集合,其中第 1 1 1个元素 a a a来自大小为 p p p的一个集合,而对于 a a a的每个选择,元素 b b b q q q种选择,则 S S S的大小为 p × q p×q p×q。乘法原理是加法原理的推论,因为整数的乘法就是重复的加法。例如,从8男7女5儿童中选出一男一女一儿童的方法有 8 × 7 × 5 = 280 8×7×5 = 280 8×7×5=280种。

2. 排列

排列是有序的,把 n n n个元素的集合 S S S的一个 r r r排列理解为 n n n个元素中的 r r r个元素的有序摆放。
(1) 不可重复排列数 :从 n n n个不同的物品中不重复地取出 r r r个,排列数 P n r = n ( n − 1 ) ( n − 2 ) ⋯ ( n − r + 1 ) = n ! ( n − r ) ! P_{n}^{r}=n(n - 1)(n - 2)\cdots(n - r + 1)=\frac{n!}{(n - r)!} Pnr=n(n1)(n2)(nr+1)=(nr)!n!
(2) 可重复排列数:从 n n n个不同的物品中可重复地取出 r r r个,排列数为 n r n^{r} nr
例如,对26个字母排序,要求5个元音字母中的任意两个不能连续出现,问有多少种排序方法?
首先21个辅音字母排序,有 21 ! ( 21 − 21 ) ! = 21 ! \frac{21!}{(21 - 21)!}=21! (2121)!21!=21! ( 0 ! = 1 ) (0!=1) (0!=1),然后把元音字母插到这21个辅音字母之间,有22个位置可以插,等价于从22个物品中选出5个,有 22 ! ( 22 − 5 ) ! = 22 ! 17 ! \frac{22!}{(22 - 5)!}=\frac{22!}{17!} (225)!22!=17!22!种方法;最后根据乘法原理,两个步骤相乘,得出有 21 ! × 22 ! 17 ! 21!×\frac{22!}{17!} 21!×17!22!种方法。
上面的排列是线性的,所有元素排成一条线。如果不是排成一条线,而是一个圆,由于产生了循环,那么排列的数量要减少。如果把这个圆排列拆成线性排列,可以从任意位置拆开。
(3) 圆排列(循环排列,环排列)的排列数:从 n n n个元素中选 r r r个的圆排列的排列数为 P n r r = n ! r ( n − r ) ! \frac{P_{n}^{r}}{r}=\frac{n!}{r(n - r)!} rPnr=r(nr)!n!

3.组合

排列是有序的,组合是无序的,把 n n n个元素的集合 S S S r r r组合理解为从 S S S n n n个元素中 对 r r r个元素的无序选择,即 r r r S S S的一个子集。 如果 S S S中的元素都不相同,组合数 C n r = ( n r ) = P n r r ! = n ! r ! ( n − r ) ! C_{n}^{r}=\binom{n}{r}=\frac{P_{n}^{r}}{r!}=\frac{n!}{r!(n - r)!} Cnr=(rn)=r!Pnr=r!(nr)!n! ,注意这里的符号,组合数的表示有两种常用符号: C n r C_{n}^{r} Cnr ( n r ) \binom{n}{r} (rn),其中 C n r C_{n}^{r} Cnr n n n在下面, ( n r ) \binom{n}{r} (rn) n n n在上面。

例如,平面上的20个点,没有3个点共线。问这些点能确定多少条直线?能确定多少个三角形?

任意两点确定一条直线,即 n = 20 n = 20 n=20 r = 2 r = 2 r=2 C n r = ( n r ) = 20 ! 2 ! ( 20 − 2 ) ! = 190 C_{n}^{r}=\binom{n}{r}=\frac{20!}{2!(20 - 2)!}=190 Cnr=(rn)=2!(202)!20!=190;任意3点确定一个三角形, C n r = ( 20 3 ) = 20 ! 3 ! ( 20 − 3 ) ! = 1140 C_{n}^{r}=\binom{20}{3}=\frac{20!}{3!(20 - 3)!}=1140 Cnr=(320)=3!(203)!20!=1140

组合数有3个重要性质。

(1) C n r = C n n − r C_{n}^{r}=C_{n}^{n - r} Cnr=Cnnr 。从 n n n个元素中拿出 r r r个,等价于从 n n n个元素中丢掉 n − r n - r nr个。

(2) C n r = C n − 1 r + C n − 1 r − 1 C_{n}^{r}=C_{n - 1}^{r}+C_{n - 1}^{r - 1} Cnr=Cn1r+Cn1r1 ,称为帕斯卡公式。可以用DP思路证明,取或不取第 n n n个元素:若取第 n n n个元素,则在剩下的 n − 1 n - 1 n1个元素中选 r − 1 r - 1 r1个;若不取第 n n n个元素,则在剩下的 n − 1 n - 1 n1个元素中选 r r r个。这个性质很有用,需要计算 C n r C_{n}^{r} Cnr时,为避免阶乘计算,可利用这个递推关系。这个性质也用于构造帕斯卡三角(杨辉三角)。

(3) C n 0 + C n 1 + C n 2 + ⋯ + C n n = 2 n C_{n}^{0}+C_{n}^{1}+C_{n}^{2}+\cdots +C_{n}^{n}=2^{n} Cn0+Cn1+Cn2++Cnn=2n 。这个表达式体现了组合数与二进制的关系,竞赛时常常用到。一个 n n n位的二进制数,其数值范围为 0 ~ 2 n − 1 0~2^{n}-1 02n1,共有 2 n 2^{n} 2n个,每个二进制数就是一种组合。例如, n = 4 n = 4 n=4 r = 2 r = 2 r=2 ,有 C 4 2 = 6 C_{4}^{2}=6 C42=6种组合,对应二进制数:0011、0101、0110、1001、1010、1100。

计算 C n r C_{n}^{r} Cnr的方法有多种,见第3节“二项式定理和杨辉三角”。

4. 多重集的排列和组合

如果 S S S中的元素可以相同,称为多重集,如 S = { 5 × a , 7 × b , 4 × c } S = \{5×a, 7×b, 4×c\} S={ 5×a,7×b,4×c} 。下面给出多重集的排列和组合的定义。

(1) 无限多重集的排列:令 S S S是一个多重集,它有 k k k个不同的元素,每个元素都有无穷重复个数,那么 S S S r r r排列的个数为 k r k^{r} kr

(2) 有限多重集的排列:令 S S S是一个多重集,它有 k k k个不同的元素,每个元素的重数分别为 n 1 , n 2 , ⋯   , n k n_{1},n_{2},\cdots,n_{k} n1,n2,,nk S S S的大小为 n = n 1 + n 2 + ⋯ + n k n = n_{1}+n_{2}+\cdots +n_{k} n=n1+n2++nk ,则 S S S n n n排列的个数为 n ! n 1 ! n 2 ! ⋯ n k ! \frac{n!}{n_{1}!n_{2}!\cdots n_{k}!} n1!n2!nk!n!

(3) 有限多重集的组合:令 S S S是一个多重集,它有 k k k个不同的元素,每个元素都有无穷重复个数,那么 S S S r r r组合的个数为 C r + k − 1 r = ( r + k − 1 r ) = C r + k − 1 k − 1 = ( r + k − 1 k − 1 ) C_{r + k - 1}^{r}=\binom{r + k - 1}{r}=C_{r + k - 1}^{k - 1}=\binom{r + k - 1}{k - 1} Cr+k1r=(rr+k1)=Cr+k1k1=(k1r+k1)

【习题】 洛谷P2822/P5520/P3197/P2290/P4931/P5596。

2 鸽巢原理

鸽巢原理(Pigeonhole Principle),也称为抽屉原理(Drawer Principle),是很基本的组合原理。鸽巢原理的生活原型是 n + 1 n + 1 n+1只鸽子住在 n n n个巢里,那么至少有一个巢里有两只或更多鸽子。稍微推广一下, k × n + 1 k×n + 1 k×n+1只鸽子住在 n n n个巢里,那么至少有一个巢里有 k + 1 k + 1 k+1只或更多鸽子。
有简单形式和加强形式的鸽巢原理。另外,鸽巢原理是Ramsey定理的一个特例。

1. 鸽巢原理的简单形式

鸽巢原理的简单形式:把 n + 1 n + 1 n+1个物体放进 n n n个盒子,至少有一个盒子包含两个或更多的物体。
鸽巢原理的题目可以用“抽屉法”或“隔板法”来思考。竞赛题常常与整数求余结合,把余数用抽屉来处理。下面给出一些例子。
(1) 370人中,至少有两人的生日相同。
题解:把365天分成365个抽屉,那么把365人放进365个抽屉后,剩下的人不管放进哪个抽屉,里面都已经有人了。
(2) n n n个人,认识的人互相握手,至少有两个人握手次数相同。
题解:每人跟其他人握手,最少可以是0次,最多可以是 n − 1 n - 1 n1次。
如果握手最少的张三握手0次,那么剩下的 n − 1 n - 1 n1人中,握手最多的人不会超过 n − 2 n - 2 n2次。 0 ~ n − 2 0~n - 2 0n2共有 n − 1 n - 1 n1种情况。
如果握手最少的张三握手1次,那么剩下的 n − 1 n - 1 n1人中,握手最多的李四除了跟张三握手一次,跟其他 n − 2 n - 2 n2人最多握手 n − 2 n - 2 n2次,李四最多握手 n − 1 n - 1 n1次。 1 ~ n − 1 1~n - 1 1n1,共有 n − 1 n - 1 n1种情况。
如果握手最少的张三握手两次,那么剩下的 n − 1 n - 1 n1人中,握手最多的李四除了跟张三握手一次,跟其他 n − 2 n - 2 n2人最多握手 n − 2 n - 2 n2次,李四最多握手 n − 1 n - 1 n1次。 2 ~ n − 1 2~n - 1 2n1,共有 n − 2 n - 2 n2种情况。
……
所以,握手次数最多有 n − 1 n - 1 n1种情况,最少只有一种情况。把最多的 n − 1 n - 1 n1种情况看成 n − 1 n - 1 n1个抽屉, n n n个人放进这 n − 1 n - 1 n1个抽屉,至少有一个抽屉里面有两人。
(3) 有 K K K种糖果,给出每种糖果的数量;要求不能连续两次吃同样的糖果,问有没有可行的吃糖方案。
题解:找出最多的一种糖果,把它的数量 N N N看作 N N N个隔板(或抽屉),隔成 N N N个空间(把每个隔板的右边看成一个空间);其他所有糖果的数量为 S S S
S < N − 1 S < N - 1 S<N1,把 s s s个糖果放到隔板之间,这 N N N个隔板不够放,必然至少有两个隔板之间没有糖果,由于这两个隔板是同一种糖果,所以无解。
S ≥ N − 1 S≥N - 1 SN1时,肯定有解。其中一个解是:把 S S S个糖果按顺序排成一个长队,其中同种类的糖果放在一起,然后每次取 N N N个糖果,按顺序一个一个地放进 N N N个空间。由于隔板数量比每种糖果的数量都多,所以不可能有两个同样的糖果被放进一个空间里。把 s s s个糖果放完,就是一个解,一些隔板里面可能放好几种糖果。
(4) 任意5个自然数,其中必有3个数的和能被3整除。
题解:任何数除以3,余数可以是0、1、2。造3个抽屉,分别表示3种余数的情况。把5个数按余数放进3个抽屉。
若5个数分布在3个抽屉里,那么从3个抽屉中各取一个,其和能被3整除。
若5个数只分布在两个抽屉里,那么至少有一个抽屉里有3个数,取出这3个数,其和能被3整除。
若5个数全部在一个抽屉里,任取3个数,其和肯定被3整除。
(5) 任意7个不同的自然数,其中必有两个整数的和或差是10的倍数。
题解:这些数除以10,余数为0 - 9,造10个抽屉分别表示10种余数的情况。然后,把6、7、8、9这4个抽屉分别与4、3、2、1这4个抽屉合并,保持原来的0、5抽屉不变,得到新的6个抽屉。那么,至少有一个抽屉里面有两个数,它们的和或差是10的倍数。
(6) poj 2356。

例1 Find a multiple(poj 2356)
问题描述:输入 n n n个正整数, n ≤ 10000 n≤10000 n10000。每个数都不大于 15000 15000 15000,可能相同。从中找出一些数,使它们的和是 n n n的倍数。
输入:第 1 1 1行输入整数 n n n;后面 n n n行中,每行输入一个整数。
输出:如果无解,输出 0 0 0。如果有解,第1行打印数字的数量,后面每行打印出一个数字,顺序任意。如果有多个解,随便打印一个解。
先求出这 n n n个数的前缀和 s u m [ 1 ] , s u m [ 2 ] , ⋯   , s u m [ n ] sum[1],sum[2],\cdots,sum[n] sum[1],sum[2],,sum[n],如果其中有 n n n的倍数,直接输出。
如果这 n n n个前缀和都不是 n n n的倍数,把这些前缀和对 n n n求余,余数为 1 ~ n − 1 1~n - 1 1n1,共 n − 1 n - 1 n1个,用 n − 1 n - 1 n1个抽屉表示这 n − 1 n - 1 n1个余数。把 n n n个前缀和放进这 n − 1 n - 1 n1个抽屉,必然有一个抽屉中有两个前缀和。这两个前缀和相减,得到一个区间,就是答案。
poj 3370是一道类似的题目。

2. 鸽巢原理的加强形式

鸽巢原理的简单形式是加强形式的特例。
鸽巢原理的加强形式:令 q 1 , q 2 , ⋯   , q n q_{1},q_{2},\cdots,q_{n} q1,q2,,qn为正整数,如果将 q 1 + q 2 + ⋯ + q n − n + 1 q_{1}+q_{2}+\cdots+q_{n}-n + 1 q1+q2++qnn+1个物体放入 n n n个盒子,那么,或者第1个盒子至少含有 q 1 q_{1} q1个物体,或者第2个盒子至少含有 q 2 q_{2} q2个物体,……或者第 n n n个盒子至少含有 q n q_{n}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值