不必逐一列举的计数
当逐一列出每种排列不可行时,组合数学回答的是「有多少种?」。入门计数中占主导的三类经典问题是:排列(顺序重要)、组合(顺序不重要)以及排列 / 部分排列(顺序重要但只占用 n 个位置中的 k 个)。每类问题都有「允许重复」与「不允许重复」两种变体。
一个具体的起点是 无重复组合——二项式系数「n 选 k」——再根据题目需要转向有序或允许重复的兄弟工具。
决策指南
按顺序自问:
- 顺序是否重要?若是 → 排列 / 部分排列。若否 → 组合。
- 同一元素能否出现多次?若能 → 「有重复」公式。若不能 → 「无重复」。
- 是要排列 全部 n 个元素,还是只选 k 个?全排列用 n!;部分选取用下降阶乘或 n^k。
误读这三条轴中的任意一条,通常是作业和面试题里「差一个倍数因子」错误的根源。
计算器家族
- 无重复排列 — n!,n 个不同元素的有序排列。
- 有重复排列 — 存在相同副本时的多重集排列 n! / (r₁! r₂! …)。
- 无重复组合 — C(n, k) = n! / (k! (n − k)!),无序 k 子集。
- 有重复组合 — C(n + k − 1, k),从 n 种类型中取大小为 k 的多重集。
- 无重复排列(部分) — P(n, k) = n! / (n − k)!,不可重复使用的有序 k 元组。
- 有重复排列(部分) — n^k,允许重复使用的有序 k 元组。
输入为非负整数,并带有常规定义域约束(禁止重复时 k ≤ n 等)。阶乘溢出会显示为计算错误,而非静默的无穷大。
阶乘作为共同引擎
无重复公式依赖 n!——乘积 1 × 2 × … × n,约定 0! = 1。组合会除掉每个子集内部的顺序 (k!),有时还要除掉未使用的尾部 ((n − k)!)。部分排列保留顺序,因此只除以 (n − k)!。
有重复组合使用「stars and bars」恒等式 C(n + k − 1, k)。有重复排列更简单:k 个位置各自独立地从 n 个符号中选一个 → n^k。
微型例题
52 张牌抽 5 张(顺序无关、不可重复): C(52, 5)。
8 名不同选手争金/银/铜: P(8, 3) = 8 × 7 × 6。
4 位 PIN,数字可重复: 10^4 = 10000。
单词「BOOK」的字母排列: 4! / 2!,因两个 O——多重集排列。
从 5 种口味买 3 球,可重复、顺序无关: C(5 + 3 − 1, 3)。
把文字题映射到正确的计算器才是技能;算术是次要的。
防错关系式
- P(n, k) = C(n, k) × k! — 先选集合,再排序。
- n! = P(n, n) — 全排列是 k = n 的部分排列。
- C(n, k) = C(n, n − k) — 二项式系数的对称性。
- 题目允许重复却禁止重复会少算;题目禁止重复却允许重复会多算。
这些计数出现在哪里
- 概率分母(公平博弈、抽样)
- 密码与标识符强度的粗略估算(需明确威胁模型前提)
- 算法分析(搜索空间、状态枚举)
- 实验设计(处理组合)
- 体育「完赛方式」及类似排名谜题——作为数学,而非投注建议
较大的 n 增长快于直觉。C(60, 6) 已达数百万; 较小规模 n 之外的阶乘会使定精度浮点溢出——因此生产系统需要专用辅助函数与大整数库。
教学顺序
- 对小 n 通过列举数排列,再引入 n!。
- 用领奖台例子引入 P(n, k)。
- 通过除掉顺序展示 C(n, k)。
- 加入重复:先 n^k(独立位置),再 stars and bars。
- 最后才讲含重复字母的多重集排列。
跳过决策指南直接背六个相似公式,只会产生机械代入。
实现说明
用三个完整阶乘计算 C(n, k) 简单但很快溢出。乘法算法可缩小中间值。本工具集的辅助函数采用带有限数检查的阶乘除法,适合交互式教学——不适用于密码学量级的 n。对非整数及不可能的 (n, k) 对应以稳定的错误原因拒绝。
常见陷阱
- 把「5 人委员会」当成排列
- 顺序无关的无放回抽取误用 n^k
- 文字题中忘记除以相同字母的阶乘
- 购买「至多 k 件商品」时混淆有重复与无重复组合
小结
本工具集汇集六个基础计数工具:全排列与多重集排列、有/无重复组合,以及有/无重复的部分排列。先判断顺序与是否可重复使用,再选对应公式,并用小规模列举做快速验证。计算器自动完成算术,让您专注于正确建模题意。