组合数OI全解析
组合数 C a b C_a^b Cab(也记为 ( a b ) \binom{a}{b} (ba) )是组合数学的核心概念,描述 “从 a a a 个元素中选 b b b 个的方案数”,公式为 C a b = a ! b ! ( a − b ) ! C_a^b = \frac{a!}{b!(a-b)!} Cab=b!(a−b)!a!(当 0 ≤ b ≤ a 0 \leq b \leq a 0≤b≤a 时,否则为 0 0 0)。在算法竞赛(OI)中,组合数的计算因数据范围、模数条件的不同,需要选用不同方法。本文将介绍四种典型的组合数计算技巧,并补充关键定理的证明。
一、递推法:小范围组合数
适用场景
a , b ≤ 2000 a, b \leq 2000 a,b≤2000 左右,需多次查询小范围组合数(支持模数运算)。
原理
利用杨辉三角的递推性质:
C a b = C a − 1 b − 1 + C a − 1 b C_a^b = C_{a-1}^{b-1} + C_{a-1}^b Cab=Ca−1b−1+Ca−1b
边界条件为 C a 0 = C a a = 1 C_a^0 = C_a^a = 1 Ca0=Caa=1。通过递推预处理所有小范围的组合数,查询时直接取值。
递推式的证明
组合意义或代数运算均可证明:
-
组合意义:从 a a a 个元素中选 b b b 个的方案,可分为“包含某一特定元素”和“不包含该元素”两类:
- 包含特定元素:需从剩下 a − 1 a-1 a−1 个元素中选 b − 1 b-1 b−1 个,方案数为 C a − 1 b − 1 C_{a-1}^{b-1} Ca−1b−1;
- 不包含特定元素:需从剩下 a − 1 a-1 a−1 个元素中选 b b b 个,方案数为 C a − 1 b C_{a-1}^b Ca−1b。
两类方案无交集且覆盖所有可能,故 C a b = C a − 1 b − 1 + C a − 1 b C_a^b = C_{a-1}^{b-1} + C_{a-1}^b Cab=Ca−1b−1+Ca−1b。
-
代数运算:
对 C a − 1 b − 1 + C a − 1 b C_{a-1}^{b-1} + C_{a-1}^b Ca−1b−1+Ca−1b 通分并化简:
C a − 1 b − 1 + C a − 1 b = ( a − 1 ) ! ( b − 1 ) ! ( a − b ) ! + ( a − 1 ) ! b ! ( a − b − 1 ) ! = ( a − 1 ) ! ⋅ b + ( a − 1 ) ! ⋅ ( a − b ) b ! ( a − b ) ! = ( a − 1 ) ! ⋅ a b ! ( a − b ) ! = a ! b ! ( a − b ) ! = C a b \begin{align*} C_{a-1}^{b-1} + C_{a-1}^b &= \frac{(a-1)!}{(b-1)!(a-b)!} + \frac{(a-1)!}{b!(a-b-1)!} \\ &= \frac{(a-1)! \cdot b + (a-1)! \cdot (a-b)}{b!(a-b)!} \\ &= \frac{(a-1)! \cdot a}{b!(a-b)!} = \frac{a!}{b!(a-b)!} = C_a^b \end{align*} Ca−1b−1+Ca−1b=(b−1)!(a−b)!(a−1)!+b!(a−b−1)!(a−1)!=b!(a−b)!(a−1)!⋅b+(a−1)!⋅(a−b)=b!(a−b)!(a−1)!⋅a=b!(a−b)!a!=C

最低0.47元/天 解锁文章
84

被折叠的 条评论
为什么被折叠?



