原理
加法原理
若完成一件事的方法有 n n n 类,其中第 i i i 类方法包括 m i m_i mi种不同的方
法,且这种方法互不重合,则完成这件事有: N = ∑ i = 1 n m i N=\sum^{n}_{i=1}m_i N=∑i=1nmi (分
类完成)
乘法原理(分步计数原理)
若完成一件事需要 n n n 个步骤,其中第 i i i 个步骤有 m i m_i mi 种
不同的完成方法,且这种步骤互不干扰,则完成这种事
共有: N = ∏ i = 1 n m i N=∏^{n}_{i=1}m_i N=∏i=1nmi (分步完成)
抽屉原理(鸽巢原理)
把多于 n n n 个的物体放到 n n n 个抽屉里,则至少有一个抽屉里的东西不
少于两件。
推广
- 将 n n n 个物体,划分为 k k k 组,那么至少存在一个分组,含有大于或等于 ⌈ n k ⌉ ⌈\frac{n}{k}⌉ ⌈kn⌉ 个物品。
- 把多于 m n + 1 ( n ≠ 0 ) mn+1(n≠0) mn+1(n=0) 个的物体放到 n n n 个抽屉里,则至少有一个抽屉里有不少于 m + 1 m+1 m+1 的物体。
题目
容斥定理
设 U U U 中元素有 n n n 种不同的属性,而第 i i i 种属性称为 P i P_i Pi,拥有属性 P i P_i Pi 的元素构成集合 S i S_i Si,那么 ∣ ∪ i = 1 n S i ∣ = ∑ m = 1 n ( − 1 ) m − 1 ∑ a i < a i + 1 ∣ ∩ i = 1 m S a i ∣ |∪^{n}_{i=1}S_i|=∑^n_{m=1}(-1)^{m-1}∑_{a_i<a_{i+1}}|∩^m_{i=1}S_{a_i}| ∣∪i=1nSi∣=m=1∑n(−1)m−1ai<ai+1∑∣∩i=1mSai∣
题目
Luogu P3197 [HNOI2008]越狱
Luogu P6298 齿轮
Luogu P6600 「EZEC-2」字母
Luogu P6692 出生点
排列基础
定义
一般地,从 n n n 个不同的元素中,取出 m ( m ≤ n ) m(m ≤ n) m(m≤n) 个元素
按照一定的顺序排成一列,叫做从 n n n 个不同的元素中取出 m m m 个元素
的一个线排列,线排列的个数叫做排列数,用符号 P n m P^m_n Pnm表示
全排列
特别地,把 n n n 个不同的元素全部取出按照一定的顺序排成一列,叫
做从 n n n 个不同的元素的一个全排列,全排列的个数叫做全排列数,
用符号 P n n P^n_n Pnn表示
排列数公式
P
n
m
=
n
!
(
n
−
m
)
!
P^m_n = \frac{n!}{(n-m)!}
Pnm=(n−m)!n!
P
n
n
=
n
!
P^n_n = n!
Pnn=n!
组合基础
定义
一般地,从 n n n 个不同的元素中,取出 m ( m ≤ n ) m(m ≤ n) m(m≤n) 个元素
不考虑顺序排成一列,叫做从 n n n 个不同的元素中取出 m m m 个元素
的一个非重组合(组合),非重组合的个数叫做非重组合数(组合数),用符号 C n m C^m_n Cnm 或 ( m n ) (^n_m) (mn) 表示
公式
- 组合数公式 C n m = n ! m ! ( n − m ) ! C^m_n=\frac{n!}{m!(n-m)!} Cnm=m!(n−m)!n!
- 帕斯卡公式 C n m = C n − 1 m − 1 + C n − 1 m C^m_n=C^{m-1}_{n-1}+C^{m}_{n-1} Cnm=Cn−1m−1+Cn−1m
C n m C^m_n Cnm 可以从两种状态转移:
1.从前 n − 1 n-1 n−1 个元素中取出 m − 1 m-1 m−1 个,然后选走第 n n n 个,即 C n − 1 m − 1 C^{m-1}_{n-1} Cn−1m−1
2.从前 n − 1 n-1 n−1 个元素中取出 m m m个,不选走第 n n n 个,即 C n − 1 m C^m_{n-1} Cn−1m
由加法原理,得 C n m = C n − 1 m − 1 + C n − 1 m C^m_n=C^{m-1}_{n-1}+C^{m}_{n-1} Cnm=Cn−1m−1+Cn−1m,即杨辉三角形
- C n m = C n n − m C^m_n=C^{n-m}_n Cnm=Cnn−m
显然从 n n n 中选 m m m 个等同于从 n n n 中取 n − m n - m n−m个
盒子与球问题
组合数学问题中,我们通常可以将问题转化为盒子与球的模型来简
化问题。
模型
有 n n n 个相同\不同 的球,放进 m m m 个 相同\不同 的盒子里,盒子
允许\不允许 为空,求方案数。
解法
- 有 n n n 个不同 的球,放进 m m m 个 不同 的盒子里,盒子 允许 为空,求方案数。
对于每一个球来说,有 m m m 种放法,根据乘法原理,得 m n m^n mn
这种排列即相异元素可重排列
隔板法
在讲下列解法之前,总结一个经典解法:
对于有 n n n 个相同 的球,放进 m m m 个 不同 的盒子里这种问题,我们可以用隔板法来解决。
- 有 n n n 个相同 的球,放进 m m m 个 不同 的盒子里,盒子 不允许 为空,求方案数。
我们可以把这 n n n 个球排成一列,放进 m m m 个不同的盒子里等同于将这一列球划分成 m m m 个区域。则我们可以用隔板来划分这 m m m 个区域。则有 m − 1 m-1 m−1 个隔板,隔板可以放的位置即两个球之间的间隙,则间隙数量为 n − 1 n - 1 n−1个。则问题转化成从 n − 1 n-1 n−1 个间隙中选 m − 1 m-1 m−1个,不考虑顺序,即 C n − 1 m − 1 C^{m-1}_{n-1} Cn−1m−1
- 有 n n n 个相同 的球,放进 m m m 个 不同 的盒子里,盒子 允许 为空,求方案数。
此问题可以由问题 2 2 2推来。如果在每个盒子里放入一个球,即加了 m m m 个球,则每个盒子不可能为空,那么问题就转化成了问题 2 2 2。即 C n + m − 1 m − 1 = C n + m − 1 n C^{m - 1}_{n + m - 1}=C^{n}_{n + m - 1} Cn+m−1m−1=Cn+m−1n
- 有 n n n 个相同 的球,放进 m m m 个 相同 的盒子里,盒子 允许 为空,求方案数。
设 f [ i ] [ j ] f[i][j] f[i][j] 为 i i i 个球放入 j j j 个盒子里的方案,则有两种情况:
- 存在一个盒子不放球,方案数为 f [ i ] [ j − 1 ] f[i][j-1] f[i][j−1]
- 所有盒子都放球,方案数为 f [ i − j ] [ j ] f[i-j][j] f[i−j][j]
根据加法原理,得到递推式 f [ i ] [ j ] = f [ i ] [ j − 1 ] + f [ i − j ] [ j ] ( 1 ≤ i ≤ n , 1 ≤ j = m i n ( i , j ) ≤ m ) f[i][j]=f[i][j-1]+f[i-j][j](1≤i≤n,1≤j=min(i,j)≤m) f[i][j]=f[i][j−1]+f[i−j][j](1≤i≤n,1≤j=min(i,j)≤m)
则边界 f [ 0 ] [ 0 ] = 1 f[0][0]=1 f[0][0]=1, f [ n ] [ m ] f[n][m] f[n][m] 即为答案
- 有 n n n 个相同 的球,放进 m m m 个 相同 的盒子里,盒子 不允许 为空,求方案数。
与问题 4 4 4类似。
还是设 f [ i ] [ j ] f[i][j] f[i][j] 为 i i i 个球放入 j j j 个盒子里的方案,则有两种情况:
- 存在一个盒子只有一个球,方案数为 f [ i − 1 ] [ j − 1 ] f[i-1][j-1] f[i−1][j−1]
- 所有盒子都有一个球以上,则方案数为 f [ i − j ] [ j ] f[i-j][j] f[i−j][j]
根据加法原理,得到递推式 f [ i ] [ j ] = f [ i − 1 ] [ j − 1 ] + f [ i − j ] [ j ] ( 1 ≤ i ≤ n , 1 ≤ j = m i n ( i , j ) ≤ m ) f[i][j]=f[i-1][j-1]+f[i-j][j](1≤i≤n,1≤j=min(i,j)≤m) f[i][j]=f[i−1][j−1]+f[i−j][j](1≤i≤n,1≤j=min(i,j)≤m)
则边界 f [ 0 ] [ 0 ] = 1 f[0][0]=1 f[0][0]=1, f [ n ] [ m ] f[n][m] f[n][m] 即为答案
- 有 n n n 个不相同 的球,放进 m m m 个 相同 的盒子里,盒子 不允许 为空,求方案数。
设 f [ i ] [ k ] f[i][k] f[i][k] 为 i i i 个球放入 j j j 个盒子里的方案,则对于第 i i i 个球来说有两种情况:
- 有一个空盒且放入这个空盒,则方案数为 f [ i − 1 ] [ j − 1 ] f[i-1][j-1] f[i−1][j−1]
- 没有空盒则可放入任意一个盒里,则方案数为 j ∗ f [ i − 1 ] [ j ] j*f[i-1][j] j∗f[i−1][j]
根据加法原理,得到递推式 f [ i ] [ j ] = f [ i − 1 ] [ j − 1 ] + j ∗ f [ i − 1 ] [ j ] ( 1 ≤ i ≤ n , 1 ≤ j = m i n ( i , j ) ≤ m ) f[i][j]=f[i-1][j-1]+j*f[i-1][j](1≤i≤n,1≤j=min(i,j)≤m) f[i][j]=f[i−1][j−1]+j∗f[i−1][j](1≤i≤n,1≤j=min(i,j)≤m)
则边界 f [ 0 ] [ 0 ] = 1 f[0][0]=1 f[0][0]=1, f [ n ] [ m ] f[n][m] f[n][m] 即为答案
此类数即为第二类斯特林数
- 有 n n n 个不相同 的球,放进 m m m 个 相同 的盒子里,盒子 允许 为空,求方案数。
与问题 6 6 6类似。
考虑 1 − ( n − 1 ) 1 - (n-1) 1−(n−1) 个盒子为空的情况,则 f [ n ] [ m ] = f [ n ] [ 1 ] + f [ n ] [ 2 ] + … … + f [ n ] [ m − 1 ] f[n][m]=f[n][1]+f[n][2]+……+f[n][m-1] f[n][m]=f[n][1]+f[n][2]+……+f[n][m−1]
则边界 f [ n ] [ 1 ] = 1 f[n][1]=1 f[n][1]=1, f [ n ] [ m ] f[n][m] f[n][m] 即为答案
此类数即为贝尔数
- 有 n n n 个不相同 的球,放进 m m m 个 不相同 的盒子里,盒子 不允许 为空,求方案数。
与问题 6 6 6相似(不能说一模一样,只能说毫无差别)
因为盒子不同,所以最后要乘盒子的全排列,即 f [ n ] [ m ] ∗ A m m f[n][m]*A^m_m f[n][m]∗Amm