zoukankan      html  css  js  c++  java
  • 二项式反演理解与证明

    二项式反演

      如果有(g_{i} = sum_{j = 1}^{i} inom{i}{j}f_{j} Longleftrightarrow f_{i} = sum_{j = 1}^{i}(-1)^{i - j} inom{i}{j}g_{j})
      证明:
      先将1式带入2式,得到
      $$f_{i} = sum_{j = 1}^{i}(-1)^{i - j} inom{i}{j}sum_{k = 1}^{j} inom{j}{k}f_{k}$$
      证明等式成立相当于证明对于等式右边而言,所有(f_{k})的系数为([i == k])
      则(f_{k})的系数为(sum_{j = k}^{i} (-1)^{i - j} inom{i}{j} inom{j}{k})
      化简:$$sum_{j = k}^{i}(-1)^{i - j} frac{i!}{j!(i - j)!} frac{j!}{k!(j - k)!}$$
      消去(j!),提出(frac{i!}{k!}),
      $$(sum_{j = k}^{i}(-1)^{i - j} frac{1}{(i - j)!(j - k)!}) frac{i!}{k!}$$
      乘((i - k)!),除((i - k)!),
      $$(sum_{j = k}^{i}(-1)^{i - j} frac{(i - k)!}{(i - j)!(j - k)!}) frac{i!}{k!(i - k)!}$$
      $$(sum_{j = k}^{i}(-1)^{i - j} inom{i - k}{j - k}) inom{i}{k}$$
      ---> 证:$$sum_{j = k}^{i}(-1)^{i - j} inom{i - k}{j - k} = [i == k]$$
      如果成立,则:当(i == k)时,(inom{i}{k} = 1),所以系数为1;当(i != k)时,前一个式子为0,所以系数为0.
      证明:
        当(i - k)为奇数时,相当于有(i - k + 1)个数相加(分别对应取0个,取1个...取i - k个),一共偶数个,其中第一项与最后一项异号,第二项与倒数第2项异号。。。根据组合数的对称性,和为0。
        当(i - k)为偶数时,相当于证:
        (inom{i}{0} - inom{i}{1} + inom{i}{2} - ... -inom{i}{i - 1} + inom{i}{i} = 0)
        二项式定理证明
          $$0^{n} = (1 - 1)^{n} = sum_{k = 0}^{n} inom{n}{k}x^{n - k}y^{k} = 0$$
          其中(x = 1, y = -1).
          则(x^{n - k})恒为1,(y^{k} = +1, -1, +1, -1 ....)
          因此原式成立
        组合数证明(杨辉三角)
          原式 = (inom{i - 1}{0} - (inom{i - 1}{0} + inom{i - 1}{1})......)
          因此最后每一项都被抵消了,所以原式 = 0;
      二项式反演还有另一种形式:
        $$g_{i} = sum_{j = 1}^{i}(-1)^{j} inom{i}{j} f_{j} Longleftrightarrow f_{i} = sum_{j = 1}^{i}(-1)^{j} inom{i}{j}g_{j}$$
        这种性质可以用容斥来理解(非证明)。
        因为可以把(f_{j})看做是满足某个性质的一个由i个集合组成的小集合,并且每个这样的小集合都是相等的。因此(inom{i}{j})就等于这样的集合个数,而((-1)^{j})是容斥系数,因为进行了容斥,所以(g_{i})可以看做是不满足某个性质的一个由i个集合组成的小集合,因此用(g_{i})(f)数组时,也是一样的容斥方式。
      应用:
        错排问题:设(f_{i})表示恰好有(i)个数不在原位的方案数,(g_{i} = i!)
        那么有
        $$g_{n} = sum_{i = 0}^{n} inom{n}{i} f_{i}$$
        根据二项式反演得:
        $$f_{n} = sum_{i = 0}^{n}(-1)^{n - i} inom{n}{i}g_{i}$$
        $$f_{n} = sum_{i = 0}^{n}(-1)^{n - i} inom{n}{i}i!$$
        $$f_{n} = sum_{i = 0}^{n}(-1)^{n - i} frac{n!}{(n - i)!}$$
        改成枚举(n - i)
        $$= n!sum_{i = 0}^{n} frac{(-1)^{i}}{i!}$$
        注意:这里只能保证反演后的式子满足最初的式子,但因为只用到了原来的那个式子,并不一定可以满足所有可以满足第一个式子的(f_{i})的含义。如用(f_{i})表示恰好(i)个数在原位的方案数,那么式子还是一样的,但现在反演后的式子与这个(f_{i})的定义相违背。
        球的染色问题:n个球,k种颜色,求满足相邻颜色不同,每种颜色至少出现一次的方案数。
        如果忽略每种颜色至少出现一次的限制的话,方案数就为(k(k - 1)^{n - 1}),相当于依次安排颜色,对于任意一个非第一个的球,都需要保证与上一个球的颜色不同,因此方案数为(k - 1),第一个球因为没有限制,所以方案数为(k)
        设(f_{i})表示恰好使用i种颜色的方案数。(g_{k})表示n个球,用了k种颜色,不强制每种颜色必须出现的方案数。那么问题就是要求(f_{n})
        因为不强制每种颜色必须出现的方案数就是出现i(0, 1, 2, 3, 4...)种颜色的方案数之和。所以:
        $$g_{k} = k(k - 1)^{n - 1} = sum_{i = 0}^{k} inom{k}{i} f_{i}$$
        反演后:
        $$f_{k} = sum_{i = 0}^{k} inom{k}{i} g_{i}$$
        $$f_{k} = sum_{i = 0}^{k} inom{k}{i} i(i - 1)^{n - 1}$$

  • 相关阅读:
    单例模式
    SRM147 DIV2 950
    SRM147 DIV2 600
    SRM147 DIV2 250
    SRM147 DIV1 1000
    Python 实现字符串反转的9种方法
    ubtuntu redis 集群部署/搭建(官方原始方案)
    Python2 ValueError: chr() arg not in range(256) 解决办法?
    python 字典操作中has_key() 和 in 那个使用更加pythonic?
    Python库 使用filetype精确判断文件类型
  • 原文地址:https://www.cnblogs.com/ww3113306/p/10114679.html
Copyright © 2011-2022 走看看