排列组合+球与盒子十二重计数法

今天我们来讲讲排列组合。

基础公式

这个就不讲了,直接列出来吧。

排列:\(A_n^m = \frac{n!}{(n-m)!}\)

组合:$C_n^m = \frac{n!}{m!(n-m)!} $

一些类型

圆排列

\(n\) 个元素的序列 \(A\) 中,取出 \(k\) 个元素排列成一个圆,求使得不同的圆排列的排列数。

公式:\(\frac{A_n^k}{k}\)

推导:

步骤计算直线排列

首先,我们假设这 \(r\) 个元素排成一排。根据排列公式,方案数为:

\[P_n^r = \frac{n!}{(n-r)!} \]

步骤 2:分析重复性

对于任何一个圆排列,如果我们将其在圆周上的 \(r\) 个位置依次作为起点“断开”并拉直,可以得到 \(r\) 个不同的直线排列。
例如,圆排列 \((A, B, C, D)\) 对应以下 4 个直线排列:

  1. \((A, B, C, D)\)
  2. \((D, A, B, C)\)
  3. \((C, D, A, B)\)
  4. \((B, C, D, A)\)

步骤 3:得出结论

因为每 \(r\) 个直线排列只对应 1 个圆排列,所以圆排列总数 \(Q_n^r\) 为:

\[Q_n^r = \frac{P_n^r}{r} = \frac{n!}{r \cdot (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\) 的标签)。
此时,全排列的总数就是:

\[N_{total} = n! \]

步骤 2:分析重复造成的冗余

考虑其中一种元素 \(a_i\),它出现了 \(n_i\) 次。
在上述 \(n!\) 种排列中,如果我们只改变这 \(n_i\) 个相同元素之间的相对位置,而保持其他元素位置不变,得到的排列在视觉上是完全一样的。

  • \(n_i\) 个相同元素内部的直线排列数为 \(n_i!\)
  • 也就是说,每一种真实的排列方式,在 \(n!\) 中都被重复计算了 \(n_i!\) 次。

步骤 3:得出最终公式

为了得到不重复的排列数,我们需要从总数中依次除去每种重复元素内部的全排列数:

\[W = \frac{n!}{n_1! \cdot n_2! \cdot \dots \cdot n_k!} \]


另一种视角:组合位置法

我们也可以用“占座”的思想来推导:

  1. \(n\) 个空位中选出 \(n_1\) 个位置放元素 \(a_1\):方案数为 \(C_n^{n_1}\)
  2. 从剩下的 \(n - n_1\) 个位置中选出 \(n_2\) 个位置放 \(a_2\):方案数为 \(C_{n-n_1}^{n_2}\)
  3. ...以此类推。

总排列数为:

\[W = C_n^{n_1} \cdot C_{n-n_1}^{n_2} \cdot C_{n-n_1-n_2}^{n_3} \dots C_{n_k}^{n_k} \]

展开组合数公式后,中间项会全部约去,结果同样指向:

\[W = \frac{n!}{n_1! n_2! \dots n_k!} \]

容斥原理

1. 核心思想

在计数时,为了计算几个集合的并集的大小,如果我们直接将各个集合的大小相加,重叠的部分就会被重复计算。
容斥原理的核心就是:先不考虑重叠直接相加(包含),再减去重复计算的部分(排除),如此反复调整直到结果准确。

2. 从两个集合开始 (n = 2)

假设有两个集合 \(A\)\(B\)

  1. 我们想求 \(|A \cup B|\)\(A\)\(B\) 发生的总数)。
  2. 直接相加:\(|A| + |B|\)。此时,中间重叠的部分 \(|A \cap B|\) 被加了 2 次。
  3. 减去重复:

    \[|A \cup B| = |A| + |B| - |A \cap B| \]

3. 三个集合的情况 (n = 3)

对于集合 \(A, B, C\),推导过程如下:

  1. \(|A| + |B| + |C|\) (两两重叠部分被多算了,三者重叠部分被算了 3 次)。
  2. \(- |A \cap B| - |B \cap C| - |C \cap A|\) (两两重叠补回来了,但三者重叠部分被减了 3 次,现在计数为 0)。
  3. \(+ |A \cap B \cap C|\) (把三者重叠的部分补回来)。

公式为:

\[|A \cup B \cup C| = (|A| + |B| + |C|) - (|A \cap B| + |B \cap C| + |C \cap A|) + |A \cap B \cap C| \]

4. 一般性公式(通式)

\(S\) 为全集,\(P_1, P_2, \dots, P_n\)\(n\) 个属性,则满足至少一个属性的元素个数为:

\[\left| \bigcup_{i=1}^n A_i \right| = \sum_{i=1}^n |A_i| - \sum_{1 \le i < j \le n} |A_i \cap A_j| + \sum_{1 \le i < j < k \le n} |A_i \cap A_j \cap A_k| - \dots + (-1)^{n-1} |A_1 \cap \dots \cap A_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_n = (n-1) \cdot (D_{n-1} + D_{n-2}) \]

初始条件: \(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\) 份)
  1. 组合数 C(n, k):

    • 使用递推 C[i][j] = C[i-1][j-1] + C[i-1][j] 实现。
  2. 第二类斯特林数 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
  3. 整数拆分 p(n, m):

    • 定义:将整数 n 拆分为不超过 m 个正整数之和。
    • 递推:f[i][j] = f[i-j][j] + f[i][j-1]
posted @ 2026-02-28 19:13  OiLight  阅读(184)  评论(0)    收藏  举报