Lec 16 计数技巧
资料依据:课程视频与 transcript · Lecture notes
TL;DR
- 除法法则适用于每个目标对象都被同样多个表示对象对应的情形;如果重数不一致,就不能直接整体相除。
- 组合数 (rn) 计数从 n 个不同对象中选出 r 个的无序子集,由有序选择数除以 r! 得到。
- 复杂扑克牌型等问题需先选择一个不重不漏的分类或构造顺序,再使用乘法、加法或补集计数。
1. 规则回顾
- 乘法法则: ∣A1×⋯×An∣=∣A1∣⋯∣An∣,用于"且"关系。
- 双射法则: 若 f:A→B 是双射,则 ∣A∣=∣B∣。
- 加法法则: 若 A1,…,An 两两不相交,则 ∣A1∪⋯∪An∣=∣A1∣+⋯+∣An∣,用于"或"关系。
- 广义乘法法则: 每步选择数量固定(不依赖之前选择的具体内容)时,总数为各步选择数之积。
广义乘法法则反例: 求三位递增序列的数量时,第二位的选择数依赖第一位,因此不能直接用。
排列: 集合 S 的一个排列是包含 S 中每个元素恰好一次的序列。若 ∣S∣=n,则共有 n! 个排列。
2. 除法法则(Division Rule)
定义: 若 f:A→B 是全函数,且每个 b∈B 恰好有 k 个原像,则称 f 是 k 对 1 映射,此时 ∣B∣=∣A∣/k。
例(圆桌骑士): n 位骑士围圆桌就座,旋转等价的座位视为相同。设 P 为所有排列的集合(∣P∣=n!),C 为所有不同圆形排列的集合。每种圆形排列对应恰好 n 种线性排列(旋转),故这是 n 对 1 映射,∣C∣=n!/n=(n−1)!。
3. 组合数 (rn)
问题: 从 n 个元素中选 r 个元素的子集,共有多少种方式?
推导:
- 先选有序序列:n×(n−1)×⋯×(n−r+1)=(n−r)!n! 种。
- 每个大小为 r 的子集对应 r! 个有序序列(所有排列)。
- 由除法法则,子集数为 (n−r)!⋅r!n!。
(rn)=(n−r)!r!n!(读作“n 选 r”)
例:
- 从 350 人中选 4 名志愿者:(4350) 种。
- 从 15 种配料中选 3 种披萨配料:(315) 种。
- 抛 100 枚硬币,恰好 50 正 50 反的序列数:(50100)(约占全部 2100 种结果的 8%)。
回到递增序列问题: 从 0,1,…,9 中选 3 个数字组成递增序列,等价于选一个大小为 3 的子集(选好后按升序排列即可),答案为 (310)=10!/(3!⋅7!)。
4. 用序列/方案构造计数
方法论: 将目标对象的构造过程分解为一系列选择步骤,用广义乘法法则计数。
必须验证:
- 每组选择都产生集合中的一个对象。
- 集合中的每个对象恰好对应一种选择序列(是双射)。
若不是双射而是 k 对 1,则用除法法则修正。
4.1 扑克手牌计数基础
标准牌组:13 个点数(A, 2, ..., 10, J, Q, K)× 4 种花色 = 52 张牌。
一手牌 = 5 张牌的子集。总手牌数:(552)。
4.2 四条(4 of a Kind)
构造方案: 序列 (R,C),其中 R 是四条的点数,C 是另一张不同点数的牌。手牌由 R♣,R♡,R♢,R♠,C 确定。
验证双射:
- 每个 (R,C) 都产生一手四条牌?✓
- 每手四条牌恰好对应一个 (R,C)?✓
由广义乘法法则:13×48=624 种。
4.3 四种花色齐全
错误方案: 依次选四种花色各自的点数再选一张多余牌,共 134×48 种——但这不是双射!手牌 6♢,Q♡,A♠,2♣,J♠ 可由两种方式构造(哪张黑桃算"多余牌"有歧义),实际上是 2 对 1,故答案为 134×48/2。
正确方案(避免歧义):
- 选有两张牌的花色 S(另三种花色按字母序排为 T1,T2,T3):4 种选法。
- 选 S 对应的两个点数 Ra,Rb:(213) 种。
- 为 T1,T2,T3 各选一个点数:133 种。
每手牌恰好对应一种构造,是双射,无需再除。
4.4 至少一对(At Least One Pair)
直接构造的困难:
方案"选对子点数 + 选两张花色 + 选其余 3 张"并非双射——多对牌的手牌可以由多种不同顺序构造,且对应的重复次数还不固定(普通对子 2 次、三条 3 次、两对 4 次……),无法用简单的除法法则修正。
正确做法:补集计数。
先计算没有对子的手牌数:
- 选 5 个不同点数的集合 r1<r2<r3<r4<r5:(513) 种。
- 为每个点数独立选一种花色:45 种。
无对子手牌数 =(513)×45。
至少有一对的手牌数 =(552)−(513)×45≈49.3 的全部手牌。
我的理解
我的理解
“至少一个”往往适合数补集,“恰好一个”往往适合分类,而“先选什么、再选什么”适合乘法。先用自然语言说清每个对象被怎样唯一生成,通常比直接写公式更不容易出错。