zoukankan      html  css  js  c++  java
  • 二项式反演

    全机房最后一个会二项式反演的

    二项式反演一般用于:至少几个的情况容易算出,要求恰好几个,可以由至少几个求出恰好几个

    容斥

    首先来看一个容斥

    对于最简单的三个圆的venn图, 对于所有集合的并:

    [|A|cup|B|cup |C| = |A| + |B| + |C| - |A cap B| - |A cap C| - |B cap C| + |A cap B cap C| ]

    考虑这个容斥的含义是什么:
    首先先让三个集合各自的大小加起来, 然后发现可能会有重复, 所以将重复减去, 但是对于同一块重复, 可能会减多次, 所以再加回来

    将这个容斥扩展到任意圆显然也是可行的,所以我们得到了一个更一般的形式

    [|A_1cup A_2cup...cup A_n|=sumlimits_{1le ile n}|A_i|-sumlimits_{1le i<jle n}|A_icap A_j|+...+(-1)^{n-1} imes |A_1cap A_2cap ...cap A_n| ]

    参照三个圆的情况的含义理解, 全部加起来,减去重的,加上减重的,一直这样处理到所有圆的交,得到的就是所有圆的交

    形式化的证明:如果某一个元素被(m)个集合所包含,则其对于左侧的贡献为1,对于右侧的贡献为:

    [sum_{i=1}^{m} (-1)^{i-1} {mchoose i} = -sum_{i=1}^{m} (-1)^i {m choose i} = 1-sum_{i=0}^{m}(-1)^i{m choose i} = 1-(1-1)^m = 1 ]

    故右侧贡献也为1, 左侧等于右侧,证毕

    反演

    形式零

    首先考虑如果将上面的计算转化为计算所有集合补集的交集?

    显然所有集合的补集的交集一定等于全集所有集合的并集

    则有

    [|A_1^ccap A_2^ccap ...cap A_n^c|=|S|-sumlimits_{1le ile n}|A_i|+sumlimits_{1le i<jle n}|A_icap A_j|-...+(-1)^n imes |A_1cap A_2cap ...cap A_n| ]

    如果以(A_i^c)的补集替换掉(A_i^c)

    根据补集的补集就是原集:

    [|A_1cap A_2cap ...cap A_n|=|S|-sumlimits_{1le ile n}|A_i^c|+sumlimits_{1le i<jle n}|A_i^ccap A_j^c|-...+(-1)^n imes |A_1^ccap A_2^ccap ...cap A_n^c| ]

    假定集合大小只与集合元素个数有关:

    (f(n))表示(n)个补集的交集大小,(g(n))表示(n)个原集的交集大小

    根据上面的式子有:

    [f(n) = sum_{i=0}^{n}(-1)^{i}{n choose i} g(i) ]

    [g(n) = sum_{i=0}^{n}(-1)^{i}{n choose i} f(i) ]

    这两个式子显然是等价的

    所以有

    [f(n) = sum_{i=0}^{n}(-1)^{i}{n choose i} g(i) Leftrightarrow g(n) = sum_{i=0}^{n}(-1)^{i}{n choose i} f(i) ]

    这就是二项式反演的初始形态

    常用形式

    (h(n)=(-1)^ng(n)),带入上面的式子就有

    [f(n)=sumlimits_{i=0}^n{nchoose i}h(i)Leftrightarrow frac{h(n)}{(-1)^n}=sumlimits_{i=0}^n(-1)^i{nchoose i}f(i) ]

    再将(h(n))视为(g(n))则有

    [f(n)=sumlimits_{i=0}^n{nchoose i}g(i)Leftrightarrow g(n)=sumlimits_{i=0}^n(-1)^{n-i}{nchoose i}f(i) ]

    (tips:这里的新的(g(n))是自己定义的函数,含义为上面的定义,并不一定符合实际含义,所以在实际运算中可能会出现一些定义的函数算重的情况,这时也可以直接套用公式

    证明:

    (g(i))的式子带入左面,可以得到

    [f(n) = sum_{i=0}^{n}(-1)^{i}{n choose i} sum_{j=0}^{i}(-1)^{j}{i choose j}f(j) ]

    大概化简一下可以得到

    [f(n) = sum_{i=0}^nsum_{j=0}^i (-1) ^{i-j}{n choose i} {i choose j} f(j) ]

    转化一下求和符号得到

    [f(n) = sum_{j=0}^{n} f(j) sum_{i=j}^{n} (-1)^{i-j}{n choose i} {i choose j} ]

    ({n choose i} {i choose j})的组合含义:(n)中选择(i)个,再从(i)个中选出(j)个,显然可以转化为先从(n)个中选出(j)个,再从(n-j)中选出(i-j)个,这两部分组成了(i)

    所以原式变成

    [f(n) = sum_{j=0}^{n} f(j) sum_{i=j}^{n} (-1)^{i-j}{n choose j} {n-j choose i-j} ]

    (t=i-j) 则有

    [f(n) = sum_{j=0}^{n} {n choose j} f(j) sum_{t=0}^{n-j} (-1)^{t}{n-j choose t} ]

    [f(n) = sum_{j=0}^{n} {n choose j} f(j) (1-1)^{n-j} ]

    (n-j=0)时,不能化成最后一步,从上面的式子得到:

    [f(n) = sum_{j=0}^{n} {n choose j} f(j) ]

    (n-j eq 0)时,则((1-1)^{n-j}=0),故原式等于(0)

    所以

    [f(n) = sum_{j=0}^{n} {n choose j} f(j) [j=n] ]

    [f(n) = {n choose n} f(n) = f(n) ]

    证毕

    如初见 与初见
  • 相关阅读:
    U盘无法格式化的恢复
    ubuntu14.04下libvmi 编译安装使用
    随意模型的折纸效果 Folding effect
    使用 C# 开发智能手机软件:推箱子(二十二)
    bzoj4393【Usaco2015 Dec】Fruit Feast
    ANDROID内存优化(大汇总——中)
    游戏编程里面有哪些经典或者非常酷的算法?
    S3C2440电阻触摸屏驱动设计
    Android Studio高速定位当前打开的文件在哪个文件夹(package)下
    NOI2006最大获利
  • 原文地址:https://www.cnblogs.com/HISKrrr/p/14503420.html
Copyright © 2011-2022 走看看