排列组合+球与盒子十二重计数法
今天我们来讲讲排列组合。
基础公式
这个就不讲了,直接列出来吧。
排列:\(A_n^m = \frac{n!}{(n-m)!}\)
组合:$C_n^m = \frac{n!}{m!(n-m)!} $
一些类型
圆排列
从 \(n\) 个元素的序列 \(A\) 中,取出 \(k\) 个元素排列成一个圆,求使得不同的圆排列的排列数。
公式:\(\frac{A_n^k}{k}\)
推导:
步骤计算直线排列
首先,我们假设这 \(r\) 个元素排成一排。根据排列公式,方案数为:
步骤 2:分析重复性
对于任何一个圆排列,如果我们将其在圆周上的 \(r\) 个位置依次作为起点“断开”并拉直,可以得到 \(r\) 个不同的直线排列。
例如,圆排列 \((A, B, C, D)\) 对应以下 4 个直线排列:
- \((A, B, C, D)\)
- \((D, A, B, C)\)
- \((C, D, A, B)\)
- \((B, C, D, A)\)
步骤 3:得出结论
因为每 \(r\) 个直线排列只对应 1 个圆排列,所以圆排列总数 \(Q_n^r\) 为:
有重复元素的全排列
假设有 \(n\) 个元素,其中:
- 元素 \(a_1\) 重复出现了 \(n_1\) 次;
- 元素 \(a_2\) 重复出现了 \(n_2\) 次;
- ...
- 元素 \(a_k\) 重复出现了 \(n_k\) 次;
且满足 \(n_1 + n_2 + \dots + n_k = n\)。求这 \(n\) 个元素的全排列数目。
推导方法:消除重复法
步骤 1:假想所有元素互不相同
如果我们暂时忽略重复,把这 \(n\) 个元素都看作是唯一的(例如给重复的元素贴上 \(1, 2, 3 \dots\) 的标签)。
此时,全排列的总数就是:
步骤 2:分析重复造成的冗余
考虑其中一种元素 \(a_i\),它出现了 \(n_i\) 次。
在上述 \(n!\) 种排列中,如果我们只改变这 \(n_i\) 个相同元素之间的相对位置,而保持其他元素位置不变,得到的排列在视觉上是完全一样的。
- 这 \(n_i\) 个相同元素内部的直线排列数为 \(n_i!\)。
- 也就是说,每一种真实的排列方式,在 \(n!\) 中都被重复计算了 \(n_i!\) 次。
步骤 3:得出最终公式
为了得到不重复的排列数,我们需要从总数中依次除去每种重复元素内部的全排列数:
另一种视角:组合位置法
我们也可以用“占座”的思想来推导:
- 从 \(n\) 个空位中选出 \(n_1\) 个位置放元素 \(a_1\):方案数为 \(C_n^{n_1}\);
- 从剩下的 \(n - n_1\) 个位置中选出 \(n_2\) 个位置放 \(a_2\):方案数为 \(C_{n-n_1}^{n_2}\);
- ...以此类推。
总排列数为:
展开组合数公式后,中间项会全部约去,结果同样指向:
容斥原理
1. 核心思想
在计数时,为了计算几个集合的并集的大小,如果我们直接将各个集合的大小相加,重叠的部分就会被重复计算。
容斥原理的核心就是:先不考虑重叠直接相加(包含),再减去重复计算的部分(排除),如此反复调整直到结果准确。
2. 从两个集合开始 (n = 2)
假设有两个集合 \(A\) 和 \(B\):
- 我们想求 \(|A \cup B|\)(\(A\) 或 \(B\) 发生的总数)。
- 直接相加:\(|A| + |B|\)。此时,中间重叠的部分 \(|A \cap B|\) 被加了 2 次。
- 减去重复:\[|A \cup B| = |A| + |B| - |A \cap B| \]
3. 三个集合的情况 (n = 3)
对于集合 \(A, B, C\),推导过程如下:
- 加:\(|A| + |B| + |C|\) (两两重叠部分被多算了,三者重叠部分被算了 3 次)。
- 减:\(- |A \cap B| - |B \cap C| - |C \cap A|\) (两两重叠补回来了,但三者重叠部分被减了 3 次,现在计数为 0)。
- 补:\(+ |A \cap B \cap C|\) (把三者重叠的部分补回来)。
公式为:
4. 一般性公式(通式)
设 \(S\) 为全集,\(P_1, P_2, \dots, P_n\) 为 \(n\) 个属性,则满足至少一个属性的元素个数为:
简单技巧:奇加偶减
- 选出 1 个集合的交集:前面符号为 \((-1)^{1-1}\) (正)
- 选出 2 个集合的交集:前面符号为 \((-1)^{2-1}\) (负)
- 选出 \(k\) 个集合的交集:前面符号为 \((-1)^{k-1}\)
错位排列
1. 定义
错位排列是指将 \(n\) 个元素进行全排列,使得每一个元素都不在它原本的位置上。
通常用 \(D_n\) 或 \(f(n)\) 表示 \(n\) 个元素的错排数。
例如:\(n=3\) 时,原序列为 \((1, 2, 3)\),错排有 \((2, 3, 1)\) 和 \((3, 1, 2)\) 两种,\(D_3 = 2\)。
2. 递推公式推导(核心逻辑)
我们考虑将第 \(n\) 个元素放到前面的某个位置(假设是第 \(i\) 个位置,其中 \(1 \le i \le n-1\))。
情况 1:第 \(i\) 个元素跑到了第 \(n\) 个位置
- 此时 \(n\) 和 \(i\) 相当于“互换”了位置。
- 剩下的 \(n-2\) 个元素只需要完成它们自己的错排即可。
- 方案数为:\(D_{n-2}\)。
情况 2:第 \(i\) 个元素没有跑到第 \(n\) 个位置
- 此时我们可以把第 \(n\) 个位置看作是第 \(i\) 个元素的“禁区”。
- 相当于剩下的 \(n-1\) 个元素(包括元素 \(i\))在 \(n-1\) 个位置上做错排。
- 方案数为:\(D_{n-1}\)。
结论
由于 \(i\) 的取值有 \(n-1\) 种选择(从 \(1\) 到 \(n-1\)),根据加法原理和乘法原理,递推公式为:
初始条件: \(D_1 = 0, D_2 = 1\)。
十二重计数法(球与盒子)
| 球 (n) | 盒子 (m) | 限制条件 | 计算公式 | 备注 |
|---|---|---|---|---|
| 区分 | 区分 | 无限制 | \(m^n\) | 每一个球有 \(m\) 种选择 |
| 区分 | 区分 | 至多一个 (\(\le 1\)) | \(P(m, n) = \frac{m!}{(m-n)!}\) | 排列数(若 \(n > m\) 则为 0) |
| 区分 | 区分 | 至少一个 (\(\ge 1\)) | \(m! \cdot S_2(n, m)\) | \(S_2\) 为第二类斯特林数 |
| 不区分 | 区分 | 无限制 | \(\binom{n+m-1}{m-1}\) | 隔板法(可空) |
| 不区分 | 区分 | 至多一个 (\(\le 1\)) | \(\binom{m}{n}\) | 组合数 |
| 不区分 | 区分 | 至少一个 (\(\ge 1\)) | \(\binom{n-1}{m-1}\) | 隔板法(不空) |
| 区分 | 不区分 | 无限制 | \(\sum_{i=1}^m S_2(n, i)\) | 贝尔数的子集 |
| 区分 | 不区分 | 至多一个 (\(\le 1\)) | \([n \le m]\) | 只能是 1 或 0 |
| 区分 | 不区分 | 至少一个 (\(\ge 1\)) | \(S_2(n, m)\) | 第二类斯特林数定义 |
| 不区分 | 不区分 | 无限制 | \(P_m(n+m, m)\) | 整数拆分(至多 \(m\) 份) |
| 不区分 | 不区分 | 至多一个 (\(\le 1\)) | \([n \le m]\) | 只能是 1 或 0 |
| 不区分 | 不区分 | 至少一个 (\(\ge 1\)) | \(P_m(n, m)\) | 整数拆分(恰好 \(m\) 份) |
-
组合数 C(n, k):
- 使用递推
C[i][j] = C[i-1][j-1] + C[i-1][j]实现。
- 使用递推
-
第二类斯特林数 S2(n, m):
- 定义:将 n 个不同元素划分为 m 个非空循环(集合)。
- 递推:
S[i][j] = j * S[i-1][j] + S[i-1][j-1]。 - 边界:
S[i][i] = 1,S[i][1] = 1。
-
整数拆分 p(n, m):
- 定义:将整数 n 拆分为不超过 m 个正整数之和。
- 递推:
f[i][j] = f[i-j][j] + f[i][j-1]。

浙公网安备 33010602011771号