算法竞赛——组合数看这一篇就够了

组合数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!(ab)!a!(当 0 ≤ b ≤ a 0 \leq b \leq a 0ba 时,否则为 0 0 0)。在算法竞赛(OI)中,组合数的计算因数据范围模数条件的不同,需要选用不同方法。本文将介绍四种典型的组合数计算技巧,并补充关键定理的证明。

一、递推法:小范围组合数

适用场景

a , b ≤ 2000 a, b \leq 2000 a,b2000 左右,需多次查询小范围组合数(支持模数运算)。

原理

利用杨辉三角的递推性质:
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=Ca1b1+Ca1b

边界条件为 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 a1 个元素中选 b − 1 b-1 b1 个,方案数为 C a − 1 b − 1 C_{a-1}^{b-1} Ca1b1
    • 不包含特定元素:需从剩下 a − 1 a-1 a1 个元素中选 b b b 个,方案数为 C a − 1 b C_{a-1}^b Ca1b
      两类方案无交集且覆盖所有可能,故 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=Ca1b1+Ca1b
  • 代数运算
    C a − 1 b − 1 + C a − 1 b C_{a-1}^{b-1} + C_{a-1}^b Ca1b1+Ca1b 通分并化简:
    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*} Ca1b1+Ca1b=(b1)!(ab)!(a1)!+b!(ab1)!(a1)!=b!(ab)!(a1)!b+(a1)!(ab)=b!(ab)!(a1)!a=b!(ab)!a!=C

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值