只保证自己看得懂。
前置知识
0
反演的基本形式:
考虑 (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
二项式反演的基本形式一:
让我们复习一下容斥原理:
考虑对于每一个 (i),如果交集大小只与集合数目相关,那么所有的 (left| igcaplimits_{j=1}^i A_{a_j} ight|) 相等,设为 (g(i)),那么原式可以变成
这个时候令 (g(0) = |S|),那么上式就变成了
发现了吗,上式和 (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})。
所以
证毕。
2
二项式反演的基本形式二:
(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])。
仿照上面的思路,
然后求证 (sumlimits_{i=j}^n (-1)^{n-i}dbinom n i dbinom i j = [j = n])。
仿照上面的思路,
证毕。
3
二项式反演的基本形式三:
(f(i)) 表示钦定 (i) 个,然后再选,要求包括这 (i) 个的方案数,(g(i)) 表示恰好 (i) 个的方案数。这里 (f) 并不是后缀和,而是可重的,对于每一个 (f(n)),(g(i)) 都被算了 (dbinom i n) 次。(认真看,很重要)
代数证明:
又有
证毕。
4
拓展:
证明和之前一样。
例题
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))。