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

    二项式反演:

    [f(n)=sum _ {i=0}^n (-1)^i inom n i g(i) Leftrightarrow g(n)=sum _ {i=0} ^n (-1)^i inom n i f(i) ]

    这个式子可以通过集合相关知识得到(容斥)

    然后令:(h(n)=(-1)^ng(n))

    那么有

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

    然后把式子整理一下,得到第二种表示二项式定理的形式

    [f(n)=sum_{i=0}^n inom n i g(i) Leftrightarrow g(n)=sum_{i=0}^n inom n i f(i) ]

    直接带入推导并且交换枚举顺序可以得到:

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

    后面的组合数:(inom n i inom i j) 考虑其组合意义,从 (n) 个里面选 (i) 个再从 (i) 个里面选 (j) 个用组合阶乘式子能给推成(inom n jinom {n-j}{i-j})

    然后再改变枚举顺序,平移一下循环变量

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

    在后面乘上 (1) 的对应次方,用二项式定理转一步

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

    显然得证(只有(i=n)时那个 ((1-1)^{n-j}) 不为 (0)


    还有一种相对常见的式子,因为题目中大多会表述为恰好选几个,然后我们用多步容斥(或二项式反演)就会方便求解

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

    相关证明和上面的类似

    例题

    已经没有什么好害怕的了

    我们设 (g) 为正确答案,(f) 为至少 (k) 个答案

    (dp_{i,j}) 为前 (i) 个选 (j)(A) 中比 (B) 中大的

    先看是不是要配对,不要那就是 (f_{i,j}+=f_{i-1,j})

    再看如果配对的话,那就是 (f_{i,j}=f_{i-1,j-1}+(larger(i)-j+1))

    (larger(i)) 表示 (A_{i}) 大于几个 (B_i),可以用暴力或者单调栈做掉……

    (f_x=dp_{n,x} imes(n-x)!)

    这里上个反演就做完了

    [g_i=sum_{i=k}^n (-1)^{i-k} inom i k imes dp_{n,i} imes (n-i)! ]

  • 相关阅读:
    编译 | 更新标准库_交叉编译工具链
    论文 | 图文_学科
    编码 | 二进制格式设计方案
    图片 | 图片上传管理
    进程 | 查询进程中包含多少线程
    第二周02:Fusion ICP逐帧融合
    exe文件当前目录搜索文件
    第一周:读取XML深度数据并将其重建为三维点云
    第二周:01 ICP迭代交互
    C++文件读写(转载)
  • 原文地址:https://www.cnblogs.com/yspm/p/13375513.html
Copyright © 2011-2022 走看看