版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhufenghao/article/details/70889484
1. 排列组合
1. 加法法则和乘法法则
设
A
,
B
是两个无关的性质,具有性质
A
的事件有
m
个,具有性质
B
的事件有
n
个
法则 |
事件数 |
分析 |
加法法则:具有性质
A
或性质
B
的事件 |
m+n
|
这里或的意思是两个性质任选其一,
m+n=(m+0)+(0+n)
|
乘法法则:具有性质
A
和性质
B
的事件 |
m×n
|
这里和的意思是两个性质兼而有之,
m
和
n
组合的情况即为
m×n
|
2. 排列和组合
从
n
个元素中选取
m
个元素,求其方案数
元素是否有序 |
方案数 |
计算过程 |
排列:有序 |
Amn
|
n(n−1)⋯(n−m+1)=n!(n−m)!
|
组合:无序 |
Cmn
|
n(n−1)⋯(n−m+1)m!=n!m!(n−m)!
|
3. 扩展问题
1. 圆周排列
从
n
个元素中选取
m
个元素有序排列在圆周上,其方案数为
Amnm
。例如
a
,
b
,
c
,
d
这4个元素,在直线上的排列
abcd
,
dabc
,
cdab
,
bcda
是不同的,但是在圆周上则是相同的,且选出几个元素就会重复几次,所以只需要将直线上排列数除以
m
即可。
2. 允许重复的组合
一般的组合是从
n
个元素中选取
m
个元素,不允许重复选择同一个元素,组合数为
Cmn
。而如果允许重复的选择同一个元素,则组合数为
Cmn+m−1
。
可以这样思考,允许重复选择相当于在
n
个元素中多加了
m−1
个“哑元素”,一旦选中了一个“哑元素”,意味着在
n
个元素中只能选
m−1
个不同元素,也就对应着已经选中的
m−1
个元素中的某一个需要重复一次。这样的“哑元素”最多只能选
m−1
个,因为至少应该选择
n
个元素中的一个,且此时这个元素重复了
m
次。
不允许重复的组合以及允许重复的组合可以等价类比如下表
组合是否允许重复 |
类比球放盒子模型 |
解释 |
不允许重复 |
n
个不同的球放入
m
个相同的盒子且每盒1球 |
盒子相同代表无序,直接从
n
个球中选出
m
个 分别放入每个盒子即可,要求
n≥m
|
允许重复 |
m
个相同的球放入
n
个不同的盒子(允许空盒) |
增加
n
个假球,如果选中假球则实际上盒子中没有球, 使用隔板法对
m+n
个球的
m+n−1
个空插入
n−1
个隔板, 将得到
n
个部分放入盒子 |
问题变形:
1. 对于整数
n
和
m
,方程
x1+x2+⋯+xn=m
的非负整数解的个数为
Cmn+m−1
。
2. 式子
(x1+x2+⋯+xn)m
的展开式项数为
Cmn+m−1
。
3. 不相邻的组合
从
n
个元素中选取
m
个元素,要求这
m
个元素在原来的位置上均互不相邻,则组合数为
Cmn−m+1
。
可以考虑
n
个球之间一共可以插入
n−1
个隔板,且隔板都是相同的。现在假设已经选出了互不相邻的
m
个元素,那么如果把这
m
个元素放回到原来的位置上,为了保证互不相邻,这
m
个元素两两之间至少应该有两个隔板,所以先将
n−1
个隔板分配
2(m−1)
个到
m
个元素两两之间,剩下的
n−2m+1
个隔板就可以在
m
个元素之间及两边随意插入,一共
m+1
个位置。此时问题转化为将
n−2m+1
个相同隔板放在
m+1
个不同位置上的组合数。这可以由“球放盒子”模型直接求解,即
C(m+1)−1(n−2m+1)+(m+1)−1=Cmn−m+1
。
2. 递推关系
1. 汉诺塔问题
有三根杆子A,B,C。A杆上有
n
个(
n
>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:每次只能移动一个圆盘;大盘不能叠在小盘上面。问至少需要几次移动才能完成。
可以使用递归的思想,设
H(n)
表示
n
个圆盘所需要的移动次数,那么移动过程是先将前
n−1
个圆盘移动到B上,接着将第
n
个圆盘移动到C,最后还要把B上的
n−1
个圆盘移动到C。所以递推公式为
H(n)=2H(n−1)+1
,且
H(1)=1
。可以根据母函数或者数学归纳法得到
H(n)=2n−1
。
2. Fibonacci序列
雌雄一对兔子,出生两个月后能就能繁殖雌雄一对小兔,问
n
个月后有多少对兔子。
递推公式为
F(n)=F(n−1)+F(n−2)
,且
F(1)=F(2)=1
。可以根据母函数法得到
F(n)=αn−βn5√
且
α=1+5√2
和
β=1−5√2
。
3. 非线性递推序列
1. Stirling数
定义第二类Stirling数为将
n
个不同的球放入
m
个相同的盒子,且不允许空盒的方案数,用
S(n,m)
表示。其递推式为
S(n,m)=S(n−1,m−1)+mS(n−1,m)
,且
S(0,⋅)=S(⋅,0)=0
,
S(k,1)=S(k,k)=1
对所有
k≥1
。Stirling数的每一项可以用下面的三角形计算,按照递推式开看,第几行就有几个数,且每一项都是上一行相同位置的数乘以位置序号,加上上一行前一位置的数。
2. 球盒模型
按照球是否相同,盒是否相同,是否允许空盒,一共可以分为8种情况。
n
个球 |
m
个盒 |
有无空盒 |
方案数 |
不同 |
不同 |
有空盒 |
mn
,每个球都可在
m
个盒中选择,
n
个球使用乘法法则 |
不同 |
不同 |
无空盒 |
m!S(n,m)
,如果盒相同则为
S(n,m)
,再将
m
个盒全排列 |
不同 |
相同 |
有空盒 |
当
n≥m
为
S(n,1)+⋯+S(n,m)
, 当
n≤m
为
S(n,1)+⋯+S(n,n)
, 每一项表示
m−1
个空盒,
⋯
,
0
个空盒 |
不同 |
相同 |
无空盒 |
S(n,m)
,Stirling数的定义 |
相同 |
不同 |
有空盒 |
Cm−1n+m−1
,增加
m
个假球,如果选中假球则实际上盒子中没有球, 使用隔板法对
m+n
个球的
m+n−1
个空插入
m−1
个隔板, 将得到
m
个部分放入盒子 |
相同 |
不同 |
无空盒 |
Cm−1n−1
,使用隔板法对
n
个球的
n−1
个空插入
m−1
个隔板, 将得到
m
个部分放入盒子 |
相同 |
相同 |
有空盒 |
穷取法,相当于将
n
用
0,1,⋯,m
进行分解的方案数, 且分解的数字没有顺序 |
相同 |
相同 |
无空盒 |
穷取法,相当于将
n−m
用
0,1,⋯,m
进行分解的方案数, 且分解的数字没有顺序 |
3. Catalan数
Catalan数定义为给定
2n
个数由
n
个
0
和
n
个
1
组成,要求这样的排列方案数,使得排列的任意前
k
个数中的
1
的个数总是不少于
0
的个数。可以求得这样的排列方案数
Catalan(2n)=1n+1Cn2n=Cn2n−Cn−12n
。
关于Catalan数有极其多的变形问题,参见维基百科卡塔兰数,其一个巧妙的证明方法参见折现法——卡特兰数证明。
4. 容斥原理
1. De morgan定理
-
A∪B⎯⎯⎯⎯⎯⎯⎯⎯⎯=A⎯⎯⎯∩B⎯⎯⎯
-
A∩B⎯⎯⎯⎯⎯⎯⎯⎯⎯=A⎯⎯⎯∪B⎯⎯⎯
2. 容斥原理
-
|A∪B|=|A|+|B|−|A∩B|
-
|A∪B∪C|=|A|+|B|+|C|−|A∩B|−|A∩C|−|B∩C|+|A∩B∩C|
3. 广义容斥原理
-
|A∩B⎯⎯⎯|=|A|−|A∩B|
-
|A∩B∩C⎯⎯⎯|=|A∩B|−|A∩B∩C|
-
|A∩B⎯⎯⎯∩C⎯⎯⎯|=|A|−|A∩B|−|A∩C|+|A∩B∩C|
-
|A∩B⎯⎯⎯∩C⎯⎯⎯∩D⎯⎯⎯|=|A|−|A∩B|−|A∩C|−|A∩D|+|A∩B∩C|+|A∩B∩D|+|A∩C∩D|−|A∩B∩C∩D|
4. 计算举例
1. 欧拉函数问题,求不超过120的素数个数
因为
112=121>120
,所以不超过120的合数一定是2,3,5,7的倍数。分别令
A2
,
A3
,
A5
,
A7
为小于120且是2,3,5,7的倍数,则不超过120的素数个数就是
|A⎯⎯⎯2∩A⎯⎯⎯3∩A⎯⎯⎯5∩A⎯⎯⎯7|
。
|A⎯⎯⎯2∩A⎯⎯⎯3∩A⎯⎯⎯5∩A⎯⎯⎯7|==120−|A2∪A3∪A5∪A7|120−(|A2|+|A3|+|A5|+|A7|)+(|A2∩A3|+|A2∩A5|+|A2∩A7|+|A3∩A5|+|A3∩A7|+|A5∩A7|)−(|A2∩A3∩A5|+|A2∩A3∩A7|+|A2∩A5∩A7|+|A3∩A5∩A7|)+|A2∩A3∩A5∩A7|
其中一项
|A2|=⌊1202⌋=60
,
|A3|=⌊1203⌋=40
,
|A5|=⌊1205⌋=24
,
|A7|=⌊1207⌋=17
,两项
|A2∩A3|=⌊1202×3⌋=20
,
|A2∩A5|=⌊1202×5⌋=12
,
|A2∩A7|=⌊1202×7⌋=8
,
|A3∩A5|=⌊1203×5⌋=8
,
|A3∩A7|=⌊1203×7⌋=5
,
|A5∩A7|=⌊1205×7⌋=3
,三项
|A2∩A3∩A5|=⌊1202×3×5⌋=4
,
|A2∩A3∩A7|=⌊1202×3×7⌋=2
,
|A2∩A5∩A7|=⌊1202×5×7⌋=1
,
|A3∩A5∩A7|=⌊1203×5×7⌋=1
,四项
|A2∩A3∩A5∩A7|=⌊1202×3×5×7⌋=0
,因此上式等于
120−60−40−24−17+20+12+8+8+5+3−4−2−1−1+0=27
。
2. 错排问题,即1,2,
⋯
,n的全排列中每个元素都不在各自位置上的排列数
设
Ai
表示第
i
个数仍然在自己位置上的排列数,所以只需要考虑其他位置元素的全排列数即可,因此错排列数就是
|A⎯⎯⎯1∩A⎯⎯⎯2∩⋯∩A⎯⎯⎯n|=n!−|A1∪A2∪⋯∪An|
,而
|Ai||Ai∩Aj||A1∩A2∩⋯∩An|==⋮=(n−1)!(n−2)!(n−n)!i=1,2,⋯,ni≠j, i,j=1,2,⋯,n
所以错排列数等于
n!−C1n(n−1)!+C2n(n−2)!+⋯±Cnn(n−n)!=n!−n!1!+n!2!−⋯±n!n!
。