zoukankan      html  css  js  c++  java
  • 二项式反演学习笔记

    二项式反演似乎是个很有趣的东西~


    二项式反演似乎有很多条。

    第一条(最基本,最好记的一条):若序列 $f$ 和 $g$ 满足:

    $$g_n=sumlimits^n_{i=0}(-1)^i{nchoose i}f_i$$

    那么

    $$f_n=sumlimits^n_{i=0}(-1)^i{nchoose i}g_i$$

    反过来也成立。

    证明:(公式恐惧症者可以跳过)

    第一个式子代入第二个式子:

    $$f_n=sumlimits^n_{i=0}(-1)^i{nchoose i}sumlimits^i_{j=0}(-1)^j{ichoose j}f_j$$

    全部放到后面:

    $$f_n=sumlimits^n_{i=0}sumlimits^i_{j=0}(-1)^{i+j}{nchoose i}{ichoose j}f_j$$

    拆开:

    $$f_n=sumlimits^n_{i=0}sumlimits^i_{j=0}(-1)^{i+j}frac{n!}{i!(n-i)!}frac{i!}{j!(i-j)!}f_j$$

    $$f_n=sumlimits^n_{i=0}sumlimits^i_{j=0}(-1)^{i+j}frac{n!}{(n-i)!j!(i-j)!}f_j$$

    $$f_n=sumlimits^n_{i=0}sumlimits^i_{j=0}(-1)^{i+j}frac{n!}{(n-j)!j!}frac{(n-j)!}{(n-i)!(i-j)!}f_j$$

    $$f_n=sumlimits^n_{i=0}sumlimits^i_{j=0}(-1)^{i+j}frac{n!}{(n-j)!j!}frac{(n-j)!}{(n-i)!((n-j)-(n-i))!}f_j$$

    $$f_n=sumlimits^n_{i=0}sumlimits^i_{j=0}(-1)^{i+j}{nchoose j}{n-jchoose n-i}f_j$$

    改变枚举顺序:

    $$f_n=sumlimits^n_{j=0}sumlimits^n_{i=j}(-1)^{i+j}{nchoose j}{n-jchoose n-i}f_j$$

    跟 $i$ 无关的提出去:

    $$f_n=sumlimits^n_{j=0}(-1)^j{nchoose j}f_jsumlimits^n_{i=j}(-1)^i{n-jchoose n-i}$$

    枚举 $i$ 改为枚举 $i+j$:

    $$f_n=sumlimits^n_{j=0}(-1)^j{nchoose j}f_jsumlimits^{n-j}_{i=0}(-1)^{i+j}{n-jchoose n-(i+j)}$$

    $$f_n=sumlimits^n_{j=0}(-1)^{2j}{nchoose j}f_jsumlimits^{n-j}_{i=0}(-1)^i{n-jchoose n-j-i}$$

    前面,$(-1)^{2j}$ 一定是 $1$,可以省略;后面,可以添上 $1^{n-j-i}$,式子不变。

    $$f_n=sumlimits^n_{j=0}{nchoose j}f_jsumlimits^{n-j}_{i=0}(-1)^i1^{n-j-i}{n-jchoose n-j-i}$$

    后面用二项式定理:

    $$f_n=sumlimits^n_{j=0}{nchoose j}f_j(-1+1)^{n-j}$$

    根据 $0^n=[n=0]$:

    $$f_n=sumlimits^n_{j=0}{nchoose j}f_j[n=j]$$

    有用的只有 $n=j$:

    $$f_n={nchoose n}f_n$$

    得证。(似乎网上没有这个式子的证明,我仿照了别的证明才死磕出来的Q^Q)

    然而这个式子不是很常用。


    第二条(最常用的一条):若序列 $f$ 和 $g$ 满足:

    $$g_n=sum^n_{i=0}{nchoose i}f_i$$

    那么

    $$f_n=sum^n_{i=0}(-1)^{n-i}{nchoose i}g_i$$

    反过来也成立。

    证明:(公式恐惧症者可以跳过)

    第一个式子代入第二个式子:

    $$f_n=sumlimits^n_{i=0}(-1)^{n-i}{nchoose i}sumlimits^i_{j=0}{ichoose j}f_j$$

    全部放到后面:

    $$f_n=sumlimits^n_{i=0}sumlimits^i_{j=0}(-1)^{n-i}{nchoose i}{ichoose j}f_j$$

    拆开,同上可得:

    $$f_n=sumlimits^n_{i=0}sumlimits^i_{j=0}(-1)^{n-i}{nchoose j}{n-jchoose n-i}f_j$$

    改变枚举顺序:

    $$f_n=sumlimits^n_{j=0}sumlimits^n_{i=j}(-1)^{n-i}{nchoose j}{n-jchoose n-i}f_j$$

    跟 $i$ 无关的提出去:

    $$f_n=sumlimits^n_{j=0}{nchoose j}f_jsumlimits^n_{i=j}(-1)^{n-i}{n-jchoose n-i}$$

    枚举 $i$ 改为枚举 $n-i$:

    $$f_n=sumlimits^n_{j=0}{nchoose j}f_jsumlimits^{n-j}_{i=0}(-1)^i{n-jchoose i}$$

    后面,可以添上 $1^{n-j-i}$,式子不变。

    $$f_n=sumlimits^n_{j=0}{nchoose j}f_jsumlimits^{n-j}_{i=0}(-1)^i1^{n-j-i}{n-jchoose i}$$

    后面用二项式定理:

    $$f_n=sumlimits^n_{j=0}{nchoose j}f_j(-1+1)^{n-j}$$

    根据 $0^n=[n=0]$:

    $$f_n=sumlimits^n_{j=0}{nchoose j}f_j[n=j]$$

    有用的只有 $n=j$:

    $$f_n={nchoose n}f_n$$

    得证。实际上上面这两条和下面将提到的两条证明过程都十分相似,我就不赘述了。


    第三条(比较冷门的一条):若序列 $f$ 和 $g$ 满足:

    $$g_k=sum^n_{i=k}(-1)^i{ichoose k}f_i$$

    那么

    $$f_k=sum^n_{i=k}(-1)^i{ichoose k}g_i$$

    反过来也成立。


    第四条(比较常用的一条):若序列 $f$ 和 $g$ 满足:

    $$g_k=sum^n_{i=k}{ichoose k}f_i$$

    那么

    $$f_k=sum^n_{i=k}(-1)^{i-k}{ichoose k}g_i$$

    反过来也成立。


    二项式定理主要用来解决一些形如“恰好”的这类计数问题。通常恰好的方案数不好算,但是至多或者至少的方案比较好算,就可以用二项式反演。

    那么来几道例题:

    Color:UVAlive-7040题解

    已经没什么好害怕的了:洛谷4859BZOJ3622题解

    (欢迎dalao们帮忙找更多的例题,谢谢OvO)

  • 相关阅读:
    vue2手写vuex
    200.岛屿数量(DFS M-岛屿系列)
    739.每日温度(栈M)
    150.逆波兰表达式求值(栈M)
    20.有效的括号(栈L)
    前端性能优化与SEO优化整理
    Typescript:类型断言
    如何在浏览器中快速调试Typescript
    Typescript:枚举
    Typescript:接口
  • 原文地址:https://www.cnblogs.com/1000Suns/p/10353617.html
Copyright © 2011-2022 走看看