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

    只保证自己看得懂。


    前置知识

    0

    反演的基本形式:

    [f(n) = sumlimits_{i=0}^n a_{n,i} g(i) Longleftrightarrow g(n) = sumlimits_{i=0}^n b_{n,i} f(i) ag{1} ]

    考虑 (color{blue}{(1)}) 式满足什么条件时成立。
    (g(n) = sumlimits_{i=0}^n b_{n,i} f(i)) 带入 (f(n) = sumlimits_{i=0}^n a_{n,i} g(i)),可以得到 (f(n) = sumlimits_{i=0}^n sumlimits_{j=0}^i a_{n,i}b_{i,j} f(j))
    显然,(sumlimits_{i=j}^n a_{n,i}b_{i,j} = [j = n])。同理,可以得到 (sumlimits_{i=j}^i b_{n,i}a_{i,j} = [j = n])

    1

    二项式反演的基本形式一:

    [f(n) = sumlimits_{i=0}^n (-1)^i dbinom{n}{i} g(i) Longleftrightarrow g(n) = sumlimits_{i=0}^n (-1)^i dbinom{n}{i} f(i) ag{2} ]

    让我们复习一下容斥原理:

    [left| igcuplimits_{i=1}^n A_i ight| = sumlimits_{i=1}^n (-1)^{i-1} sum left| igcaplimits_{j=1}^i A_{a_j} ight| ]

    [left| igcaplimits_{i=1}^n overline{A_i} ight| = |S| - left| igcuplimits_{i=1}^n A_i ight| = |S| + sumlimits_{i=1}^n (-1)^i sum left| igcaplimits_{j=1}^i A_{a_j} ight| ]

    考虑对于每一个 (i),如果交集大小只与集合数目相关,那么所有的 (left| igcaplimits_{j=1}^i A_{a_j} ight|) 相等,设为 (g(i)),那么原式可以变成

    [left| igcaplimits_{i=1}^n overline{A_i} ight| = |S| + sumlimits_{i=1}^n (-1)^i dbinom n i g(i) ]

    这个时候令 (g(0) = |S|),那么上式就变成了

    [left| igcaplimits_{i=1}^n overline{A_i} ight| = sumlimits_{i=0}^n (-1)^i dbinom n i g(i) ]

    发现了吗,上式和 (color{blue}{(2)}) 式非常像,只需要令 (f(i) = left| igcaplimits_{i=1}^n overline{A_i} ight|),特别地,(f(0) = |S|)

    其实这里 (f(n)) 就是不具有 (n) 个性质的方案数,(g(n)) 就是具有 (n) 个性质的方案数。

    当然也可以考虑代数证明,也就是求证 (sumlimits_{i=j}^n (-1)^i dbinom n i (-1)^j dbinom i j = [j = n])
    这里有一个前置知识是 (dbinom i j dbinom j k = dbinom i k dbinom{i-k}{j-k})
    所以

    [egin{aligned} &quad\, sumlimits_{i=j}^n (-1)^i dbinom n i (-1)^j dbinom i j \ &= sumlimits_{i=j}^n (-1)^i (-1)^j dbinom n j dbinom{n-j}{i-j} \ &= (-1)^j dbinom n j sumlimits_{i=j}^n (-1)^i dbinom{n-j}{i-j} \ &= (-1)^j dbinom n j sumlimits_{i=0}^{n-j} (-1)^{i+j} dbinom{n-j}{i} \ &= (-1)^j dbinom n j sumlimits_{i=0}^{n-j} (-1)^i (-1)^j dbinom{n-j}{i} \ &= (-1)^j dbinom n j sumlimits_{i=0}^{n-j} (-1)^i 1^{n-j-i} dbinom{n-j}{i} \ &= (-1)^j dbinom n j (1-1)^{n-j} \ &= [j = n]end{aligned} ]

    证毕。

    2

    二项式反演的基本形式二:

    [f(n) = sumlimits_{i=0}^n dbinom{n}{i} g(i) Longleftrightarrow g(n) = sumlimits_{i=0}^n (-1)^{n-i} dbinom{n}{i} f(i) ag{3} ]

    (f(n)) 为至多 (n) 个的方案数,(g(n)) 为恰好 (n) 个的方案数。

    可以设 (h(i) = dfrac{g(i)}{(-1)^i}),代入 (color{blue}{(3)}) 式,得到 (f(n) = sumlimits_{i=0}^n dbinom{n}{i} (-1)^i h(i) Longleftrightarrow (-1)^n h(n)= sumlimits_{i=0}^n (-1)^{n-i} dbinom{n}{i} f(i))
    整理一下就是 (f(n) = sumlimits_{i=0}^n (-1)^i dbinom{n}{i}h(i) Longleftrightarrow h(n)= sumlimits_{i=0}^n (-1)^i dbinom{n}{i} f(i))
    (color{blue}{(2)}) 得上式成立,故 (color{blue}{(3)}) 式成立。

    也可以继续考虑代数证明,先求证 (sumlimits_{i=j}^n dbinom n i (-1)^{i-j} dbinom i j = [j = n])
    仿照上面的思路,

    [egin{aligned} &quad\, sumlimits_{i=j}^n dbinom n i (-1)^{i-j} dbinom i j \ &= sumlimits_{i=j}^n (-1)^{i-j} dbinom n j dbinom{n-j}{i-j} \ &= dbinom n j sumlimits_{i=0}^{n-j} (-1)^{i}dbinom{n-j}{i} \ &= dbinom n j (1-1)^{n-j} \ &= [j = n]end{aligned} ]

    然后求证 (sumlimits_{i=j}^n (-1)^{n-i}dbinom n i dbinom i j = [j = n])
    仿照上面的思路,

    [egin{aligned} &quad\, sumlimits_{i=j}^n (-1)^{n-i}dbinom n i dbinom i j \ &= sumlimits_{i=j}^n (-1)^{n-i}dbinom n j dbinom{n-j}{i-j} \ &= dbinom n j sumlimits_{i=0}^{n-j} (-1)^{n-i-j} dbinom{n-j}{i} \ &= dbinom n j (1-1)^{n-j} \ &= [j = n] end{aligned} ]

    证毕。

    3

    二项式反演的基本形式三:

    [f(n) = sumlimits_{i=n}^m dbinom{i}{n} g(i) Longleftrightarrow g(n) = sumlimits_{i=n}^m (-1)^{i-n} dbinom{i}{n} f(i) ag{4} ]

    (f(i)) 表示钦定 (i) 个,然后再选,要求包括这 (i) 个的方案数,(g(i)) 表示恰好 (i) 个的方案数。这里 (f) 并不是后缀和,而是可重的,对于每一个 (f(n))(g(i)) 都被算了 (dbinom i n) 次。(认真看,很重要)

    代数证明:

    [egin{aligned} &quad\, sumlimits_{i=n}^j dbinom i n (-1)^{j-i} dbinom j i \ &= dbinom j n sumlimits_{i=n}^j (-1)^{j-i} dbinom{j-n}{i-n} \ &= dbinom j n sumlimits_{i=0}^{j-n} (-1)^{j-i-n} dbinom{j-n}i \ &= dbinom j n (1-1)^{j-n} \ &= [j = n]end{aligned} ]

    又有

    [egin{aligned} &quad\, sumlimits_{i=n}^j(-1)^{i-n} dbinom i n dbinom j i \ &= dbinom j n sumlimits_{i=n}^j (-1)^{i-n} dbinom{j-n}{i-n} \ &= dbinom j n sumlimits_{i=0}^{j-n} (-1)^{i} dbinom{j-n}i \ &= dbinom j n (1-1)^{j-n} \ &= [j = n]end{aligned} ]

    证毕。

    4

    拓展:

    [f(n) = sumlimits_{i=m}^n (-1)^i dbinom{n}{i} g(i) Longleftrightarrow g(n) = sumlimits_{i=m}^n (-1)^i dbinom{n}{i} f(i) ag{5} ]

    [f(n) = sumlimits_{i=m}^n dbinom{n}{i} g(i) Longleftrightarrow g(n) = sumlimits_{i=m}^n (-1)^{n-i} dbinom{n}{i} f(i) ag{6} ]

    [f(n) = sumlimits_{i=n}^m (-1)^idbinom{i}{n} g(i) Longleftrightarrow g(n) = sumlimits_{i=n}^m (-1)^i dbinom{i}{n} f(i) ag{7} ]

    证明和之前一样。

    例题

    BZOJ 2839 集合计数

    对于交集元素钦定为 (i) 的方案,容易想到一个式子,选出 (i) 个元素的方案数乘上选出合法集合的方案数,也就是 (dbinom n i left( 2^{2^{n-i}} - 1 ight))(先不考虑其中重复部分)。
    (f(i)) 为交集元素恰好为 (i) 个时,选出合法集合的方案数,容易想到 (dbinom n i left( 2^{2^{n-i}} - 1 ight) = sumlimits_{j=i}^n dbinom j i f(j)),也就是每个 (f(j)) 都被 (dbinom n i left( 2^{2^{n-i}} - 1 ight)) 算了 (dbinom j i) 次。
    然后反演一下就能得到 (f(k) = sumlimits_{i=k}^n (-1)^{i-k} dbinom i k dbinom n i left( 2^{2^{n-i}} - 1 ight))
    对于那个 (2^{2^{n-i}}) 的预处理,可以用欧拉定理预处理 (2^{n-i} mod varphi(10^9+7)),也可以直接递推。显然 (2^{2^i} = 2^{2^{i-1} imes 2} = 2^{2^{i-1} + 2^{i-1}} = 2^{2^{i-1}} imes 2^{2^{i-1}})

     

    Luogu P5505 分特产

    每个人都被分到,等价于没有人没被分到。
    (f(i)) 表示钦定 (i) 人没被分到的方案数,(g(i)) 表示恰好 (i) 人没被分到的方案数,答案为 (g(0))
    显然 (i) 人没被分到,那么剩下至多 (n-i) 人被分配到,则 (f(i) = dbinom n i prod limits_{j=1}^m dbinom{a_j+n-i-1}{n-i-1}),特别地,(f(n) = 0)(不能所有人都不分)。
    (g(i)) 很难求,但容易发现 (f(i) = sumlimits_{j=i}^n dbinom j i g(j))
    反演一下就得到 (g(0) = sumlimits_{i=0}^n (-1)^i dbinom i 0 f(i) = sumlimits_{i=0}^{n-1} (-1)^i dbinom n i prod limits_{j=1}^m dbinom{a_j+n-i-1}{n-i-1})

    当然也可以不转化。这里还是设 (f(i)) 表示至多 (i) 人被分到的方案数,(g(i)) 表示恰好某 (i) 人被分到的方案数,答案为 (g(n))
    显然 (g(i) = prodlimits_{j=1}^m dbinom{a_j+i-1}{i-1}),因为 (g(i)) 指某 (i) 个,所以不用乘上 (dbinom n i)
    然后显然 (f(i) = sumlimits_{i=1}^n dbinom n i g(i)),反演一下得到 (g(n) = sumlimits_{i=1}^n (-1)^{n-i} dbinom n i prodlimits_{j=1}^m dbinom{a_j+i-1}{i-1})

    Luogu P4859 已经没有什么好害怕的了

    先对 (a_i,b_i) 分别从小到大排序。
    (h(i,j)) 表示 (a_1,a_2,a_3,cdots,a_i)(b_1,b_2,b_3,cdots,b_n) 中各选 (j) 个,满足每个 (a) 都大于对应的 (b)。显然 (h(i,j) = h(i-1,j) + h(i,j-1) imes (p_i - j + 1)),其中 (p_i) 表示小于 (a_i)(b) 的数量。
    (f(i)) 表示钦定 (i) 个,(g(i)) 表示恰好 (i) 个。
    考虑钦定 (i)(b),剩下的 (n-i)(b) 可以和剩下的 (n-i)(a) 任意匹配,则 ((n-i)!h(n,i) = f(i) = sumlimits_{j=i}^n dbinom j i g(j))
    设答案为恰好 (x) 个,则 (x - (n-x) = k Longleftrightarrow x = dfrac{n+k} 2),反演一下得到 (g(x) = sumlimits_{i=x}^{n} (-1)^{i-x} dbinom i x (n-i)!h(n,i))

    Luogu P6478 游戏

    和上一题很像。
    (h(u,i)) 表示以 (u) 为根的子树中,选 (i) 个非平局回合的方案数,发现是个树上背包,(h(u,i) gets sumlimits_{j=0}^m h(u,i-j) imes h(v,j))
    做完树上背包,看起是 (O(n^2m)) 的,但通过限制转移的上下界,可以优化到 (O(nm))(戳这里)。
    然后还是剩下的 (m-i) 可以任意分配,所以 ((n-i)!h(1,i) = f(i) = sumlimits_{j=i}^m dbinom j i g(j)),反演后得到 (g(i) = sumlimits_{j=i}^m (-1)^{j-i} dbinom j i (n-j)!h(1,i))

  • 相关阅读:
    linux目录结构
    php程序员要懂那些linux知识?
    树和二叉树
    linux学习课程
    顺序栈的实现
    编写一个插件(前面JavaScript高级总结)
    javascript高级课程-4
    字符串的顺序表
    js 万年历实现
    利用 postMessage 进行数据传递 (iframe 及web worker)及问题
  • 原文地址:https://www.cnblogs.com/kcn999/p/13816872.html
Copyright © 2011-2022 走看看