二项式反演

前置技能:二项式定理

定理: ( a + b ) n = ∑ k = 0 n C n k a k b n − k (a+b)^n=\sum_{k=0}^{n}C_{n}^{k} a^k b^{n-k} (a+b)n=k=0nCnkakbnk
证明:(数学归纳法)
  • ( a + b ) 1 = a + b = ∑ k = 0 1 C 1 k a k b 1 − k (a+b)^1=a+b=\sum_{k=0}^{1}C_{1}^{k}a^kb^{1-k} (a+b)1=a+b=k=01C1kakb1k

  • 假设, ( a + b ) m (a+b)^m (a+b)m满足二次项定理,那么

    ( a + b ) m + 1 = ( a + b ) ∑ k = 0 m C m k a k b m − k (a+b)^{m+1}=(a+b)\sum_{k=0}^{m}C_{m}^{k}a^kb^{m-k} (a+b)m+1=(a+b)k=0mCmkakbmk

    = ∑ k = 0 m C m k a k + 1 b m − k + ∑ k = 0 m C m k a k b m − k + 1 =\sum_{k=0}^{m}C_{m}^{k}a^{k+1}b^{m-k}+\sum_{k=0}^{m}C_{m}^{k}a^kb^{m-k+1} =k=0mCmkak+1bmk+k=0mCmkakbmk+1

    = ∑ k = 1 m + 1 C m k − 1 a k b m − k + 1 + ∑ k = 0 m C m k a k b m − k + 1 =\sum_{k=1}^{m+1}C_{m}^{k-1}a^{k}b^{m-k+1}+\sum_{k=0}^{m}C_{m}^{k}a^kb^{m-k+1} =k=1m+1Cmk1akbmk+1+k=0mCmkakbmk+1

    = ∑ k = 0 m + 1 C m k − 1 a k b m − k + 1 + ∑ k = 0 m + 1 C m k a k b m − k + 1 =\sum_{k=0}^{m+1}C_{m}^{k-1}a^{k}b^{m-k+1}+\sum_{k=0}^{m+1}C_{m}^{k}a^kb^{m-k+1} =k=0m+1Cmk1akbmk+1+k=0m+1Cmkakbmk+1

    = ∑ k = 0 m + 1 C m + 1 k a k b m + 1 − k =\sum_{k=0}^{m+1}C_{m+1}^ka^kb^{m+1-k} =k=0m+1Cm+1kakbm+1k

    证毕。

二项式反演

  • 一般,二项式反演解决的是哪些问题呢?

    • 直接求不好求,但是至少好求;
    • 直接求不好求,但是至多好求;
  • f [ i ] f[i] f[i]表示至多有 i i i个点的情况数, g [ i ] g[i] g[i]表示恰好有 i i i个点的方案数。

  • f [ n ] = ∑ i = 0 n g [ i ] ∗ C n i f[n]=\sum_{i=0}^ng[i]*C_n^i f[n]=i=0ng[i]Cni,那么 g [ n ] = ∑ i = 0 n ( − 1 ) n − i C n i f [ i ] g[n]=\sum_{i=0}^n(-1)^{n-i}C_n^if[i] g[n]=i=0n(1)niCnif[i]

  • 证明就是按照定义,将 f [ i ] f[i] f[i]代入推一推。(证明略)

  • 例题,今天比赛第一题的30分。

在这里插入图片描述

  • 题目求把一个s<=S,分到m个盒子里,前n个盒子里的小球数量均不能超过t,并且所有盒子非空的方案数。

  • 先二项式反演一下,设 f [ i ] f[i] f[i]表示n个盒子里至少有i个盒子超过t的方案数, g [ i ] g[i] g[i]表示n个盒子里恰好有i个盒子超过t的方案数。 g [ 0 ] = ∑ i = 0 n ( − 1 ) i C n i C s − i t − 1 n − 1 g[0]=\sum_{i=0}^n(-1)^iC_n^iC_{s-it-1}^{n-1} g[0]=i=0n(1)iCniCsit1n1

  • 考虑后面的 m − n m-n mn个盒子分配方式和去掉it之后前n个盒子是一样的。

  • 所以总的答案为

    ∑ i = 0 n ∑ k = 0 s C k − i t − 1 m − 1 C n i ( − 1 ) i \sum_{i=0}^n\sum_{k=0}^{s}C_{k-it-1}^{m-1}C_n^i(-1)^i i=0nk=0sCkit1m1Cni(1)i

    = ∑ i = 0 n C s − i t m C n i ( − 1 ) i =\sum_{i=0}^nC_{s-it}^{m}C_n^i(-1)^i =i=0nCsitmCni(1)i

  • 下面的这个组合数合并到一起非常的妙,能这么合并是因为你考虑C的组合意义。发现 ∑ k = 0 s C k − i t − 1 m − 1 \sum_{k=0}^sC_{k-it-1}^{m-1} k=0sCkit1m1其实就是将 s − i t s-it sit分成m份的方案数。

  • 如此,时间复杂度变为 O ( m + s ) O(m+s) O(m+s)。30分get。

  • 妈耶,集训队神题,后面的高分解法看都不敢看QAQ。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值