跳到内容

6.2 排列、组合与重复选择:顺序和重复是否重要

老陈的问题只有一句“选四个数字”,阿花却先停下来确认顺序、重复和首位限制。

“从 10 个数字选 4 位密码有多少种”没有唯一答案:能否重复?首位能否为零?12344321 是否不同?组合公式之前必须先回答这些问题。

四个基础模型

模型顺序可重复数量
长度 r 的序列重要可以n^r
r-排列重要不可以n!/(n-r)!
r-组合不重要不可以C(n,r)
r-重组合不重要可以C(n+r-1,r)

先选模型,再代公式。

排列:有序且不放回

n 个不同元素中选 r 个排成顺序:

text
P(n,r)=n(n-1)...(n-r+1)=n!/(n-r)!

十个数字中取四个且不重复,允许首位为零,并把结果视作长度 4 的代码:

text
P(10,4)=10×9×8×7=5040

若要求真正的四位十进制数,首位不能为零:

text
9×9×8×7=4536

若允许重复,则长度 4 的代码有 10⁴ 个;真正四位数有 9×10³ 个。

全排列与重复元素

n 个不同元素全排列:

text
n!

若有重复元素,交换相同元素不会产生新序列。含 n₁,...,n_k 个相同类别,总长度 n

text
n!/(n₁!n₂!...n_k!)

单词 LEVEL 有 5 个字母,L 两个、E 两个:

text
5!/(2!2!)=30

该公式假设只按字符序列区分结果;若字符实例还有隐藏身份,模型会变化。

组合:无序且不放回

n 个不同元素中选 r 个子集:

text
C(n,r)=n!/[r!(n-r)!]

推导:先数有序选择 P(n,r),每个无序子集的 r! 个排列都被重复计数:

text
C(n,r)=P(n,r)/r!

对称性:

text
C(n,r)=C(n,n-r)

选择 r 个元素,等价于决定哪 n-r 个不选。

Pascal 恒等式

固定一个特殊元素 x,大小为 r 的子集分两类:

  • 包含 x:从余下 n-1 个选 r-1 个;
  • 不包含 x:从余下 n-1 个选 r 个。

因此:

text
C(n,r)=C(n-1,r-1)+C(n-1,r)

这既是组合证明,也是 Pascal 三角的递推。用动态规划计算整行组合数时可利用它;若只求单个 C(n,r),可采用乘除交替的算法,避免先算巨大阶乘:

text
C(n,r)=∏_{i=1..r} (n-r+i)/i,取 r=min(r,n-r)

整数实现要安排约分或使用大整数,避免中间溢出和浮点舍入。

二项式定理

展开 (x+y)^n 时,从 n 个因子中选择 r 个取 y,其余取 x

text
(x+y)^n=Σ_{r=0..n} C(n,r)x^(n-r)y^r

x=y=1

text
Σ_{r=0..n} C(n,r)=2^n

左边按子集大小分类统计幂集,右边按每个元素选或不选统计。两种计数同一对象,得到恒等式。

重组合与隔板法

n 种类型中选 r 个,允许重复且不计顺序,相当于求非负整数解:

text
x₁+x₂+...+x_n=r

r 个星和 n-1 个隔板编码:

text
***|*||**

表示四种类型计数 (3,1,0,2)。总位置 r+n-1,选择 n-1 个隔板位置:

text
C(r+n-1,n-1)=C(r+n-1,r)

若每类至少一个,先给每类分一个,剩余 r-n 个:

text
C(r-1,n-1),前提 r≥n

若有上界 x_i≤u_i,简单隔板法不再直接适用,可用容斥或生成函数。

圆排列与对称性

n 个不同对象围成一圈,若只把整体旋转视为同一种排列:

text
(n-1)!

因为固定一个对象作为起点,消去 n 种旋转重复。

若镜像也视为相同,还要进一步除以 2,但小规模和额外对称可能需要单独检查。一般对称计数不能随意“看有几个对称就除几”,需要保证每个等价类大小一致,或使用 Burnside 引理。

满射计数

m 个有标签任务分给 n 个有标签工作节点,并要求每个节点至少一个任务,相当于计算从 m 元集合到 n 元集合的满射。

用容斥:

text
Σ_{k=0..n} (-1)^k C(n,k)(n-k)^m

先数全部 n^m 个函数,再减去至少空一个指定节点的分配,加回同时空两个节点的分配,依次进行。

完成检查

分别计算并说明模型:

  1. 8 位数字 PIN,允许重复和前导零;
  2. 10 人选班长、副班长、委员各一人;
  3. 10 人选 3 人小组;
  4. 12 个相同任务分给 4 个有标签节点,允许空节点;
  5. 同上但每个节点至少 1 个;
  6. MISSISSIPPI 的不同字母排列数。

参考资料

Built with VitePress | Software Systems Atlas