二项式反演及其应用

概念

二项式反演为一种反演形式,常用于通过 “指定某若干个” 求 “恰好若干个” 的问题。

注意:二项式反演虽然形式上和多步容斥极为相似,但它们并不等价,只是习惯上都称之为多步容斥。

引入

既然形式和多步容斥相似,我们就从多步容斥讲起。

我们都知道:$|A\cup B|=|A|+|B|-|A\cap B|$ ,这其实就是容斥原理。

它的一般形式为:

$$|A_1\cup A_2\cup...\cup A_n|=\sum\limits_{1\le i\le n}|A_i|-\sum\limits_{1\le i<j\le n}|A_i\cap A_j|+...+(-1)^{n-1}\times |A_1\cap A_2\cap ...\cap A_n|$$

证明:

设某一元素被 $m$ 个集合所包含,则其对左侧的贡献为 $1$ ;
对右侧的贡献为 $\sum\limits_{i=1}^m(-1)^{i-1}{m\choose i}=-\sum\limits_{i=1}^m(-1)^i{m\choose i}=1-\sum\limits_{i=0}^m(-1)^i{m\choose i}=1-(1-1)^m=1$ 。

故左侧等于右侧 ,证毕。

形式

形式零

沿用刚刚多步容斥的公式,记 $A_i^c$ 表示 $A_i$ 的补集,则将一般形式变形,可以得到:
$$
|A_1^c\cap A_2^c\cap ...\cap A_n^c|=|S|-\sum\limits_{1\le i\le n}|A_i|+\sum\limits_{1\le i<j\le n}|A_i\cap A_j|-...+(-1)^n\times |A_1\cap A_2\cap ...\cap A_n|
$$
同时,由于补集的补集就是原集,因此又有:
$$
|A_1\cap A_2\cap ...\cap A_n|=|S|-\sum\limits_{1\le i\le n}|A_i^c|+\sum\limits_{1\le i<j\le n}|A_i^c\cap A_j^c|-...+(-1)^n\times |A_1^c\cap A_2^c\cap ...\cap A_n^c|
$$
考虑一种特殊情况:多个集合的交集大小只和集合的数目有关。

记 $f(n)$ 表示 $n$ 个补集的交集大小,$g(n)$ 表示 $n$ 个原集的大小,则两个公式分别可以写成:
$$
f(n)=\sum\limits_{i=0}^n(-1)^i{n\choose i}g(i)\
g(n)=\sum\limits_{i=0}^n(-1)^i{n\choose i}f(i)
$$
显然这两个公式是等价关系,更是相互推导的关系,于是我们得到了二项式反演的形式零:
$$
f(n)=\sum\limits_{i=0}^n(-1)^i{n\choose i}g(i)\Leftrightarrow g(n)=\sum\limits_{i=0}^n(-1)^i{n\choose i}f(i)
$$

形式一

公式如下:
$$
f(n)=\sum\limits_{i=0}^n{n\choose i}g(i)\Leftrightarrow g(n)=\sum\limits_{i=0}^n(-1)^{n-i}{n\choose i}f(i)
$$

证明一

在形式零中,令 $h(n)=(-1)^ng(n)$ ,则形式零就变为了:
$$
f(n)=\sum\limits_{i=0}^n{n\choose i}h(i)\Leftrightarrow \frac{h(n)}{(-1)^n}=\sum\limits_{i=0}^n(-1)^i{n\choose i}f(i)
$$
整理后就是形式一。

证明二

将右侧代入左侧,则:

$$
\begin{split}
f(n)&=\sum\limits_{i=0}^n{n\choose i}\sum\limits_{j=0}^i(-1)^{i-j}{i\choose j}f(j)\&=\sum\limits_{i=0}^n\sum\limits_{j=0}^i(-1)^{i-j}{n\choose i}{i\choose j}f(j)
\end{split}
$$

考虑调换两个求和符号的顺序,即先枚举 $i$ ,再枚举 $j$ ,则又有:
$$
f(n)=\sum\limits_{j=0}^nf(j)\sum\limits_{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$ 个,即 ${n\choose j}{n-j\choose i-j}$ 。

于是可以得到:
$$
\begin{split}
f(n)&=\sum\limits_{j=0}^n{n\choose j}f(j)\sum\limits_{i=j}^n{n-j\choose i-j}(-1)^{i-j}\
&=\sum\limits_{j=0}^n{n\choose j}f(j)\sum\limits_{t=0}^{n-j}{n-j\choose t}(-1)^t1^{n-j-t}\
&=\sum\limits_{j=0}^n{n\choose j}f(j)(1-1)^{n-j}
\end{split}
$$
当 $n-j\neq 0$ 时,显然 $(1-1)^{n-j}=0$ ;
当 $n-j=0$ 时,出现 $0^0$ 不能直接计算,需要使用组合形式求解,此时 ${n-j\choose t}(-1)^{t}=1$ 。

故 $\sum\limits_{t=0}^{n-j}{n-j\choose t}(-1)^t=[j=n]$ ,于是:
$$
f(n)={n\choose n}f(n)=f(n)
$$
左右恒等,证毕。

注:由于证明二并未用到 $i$ 从 $0$ 开始这一性质,因此更通用的公式为:
$$
f(n)=\sum\limits_{i=m}^n{n\choose i}g(i)\Leftrightarrow g(n)=\sum\limits_{i=m}^n(-1)^{n-i}{n\choose i}f(i)
$$

形式二

这个形式和形式一类似,是最常用的公式。公式如下:
$$
f(n)=\sum\limits_{i=n}^m{i\choose n}g(i)\Leftrightarrow g(n)=\sum\limits_{i=n}^m(-1)^{i-n}{i\choose n}f(i)
$$

证明

将右侧代入左侧,则:
$$
\begin{split}
f(n)&=\sum\limits_{i=n}^m{i\choose n}\sum\limits_{j=i}^m(-1)^{j-i}{j\choose i}f(j)\
&=\sum\limits_{i=n}^m\sum\limits_{j=i}^m(-1)^{j-i}{i\choose n}{j\choose i}f(j)\
&=\sum\limits_{j=n}^mf(j)\sum\limits_{i=n}^j(-1)^{j-i}{i\choose n}{j\choose i}\
&=\sum\limits_{j=n}^m{j\choose n}f(j)\sum\limits_{i=n}^j{j-n\choose j-i}(-1)^{j-i}\
&=\sum\limits_{j=n}^m{j\choose n}f(j)\sum\limits_{t=0}^{j-n}{j-n\choose t}(-1)^{t}1^{j-n-t}\
&=\sum\limits_{j=n}^m{j\choose n}f(j)(1-1)^{j-n}\
&=\sum\limits_{j=n}^m{j\choose n}f(j)[j=n]\
&={n\choose n}f(n)\
&=f(n)
\end{split}
$$

左右恒等,证毕。

组合意义

记 $f(n)$ 表示 “钦定选 $n$ 个”,$g(n)$ 表示 “恰好选 $n$ 个”,则对于任意的 $i\ge n$ ,$g(i)$ 在 $f(n)$ 中被计算了 $i\choose n$ 次,故 $f(n)=\sum\limits_{i=n}^m{i\choose n}g(i)$ ,其中 $m$ 是数目上界。

注意:在定义中,$f(n)$ 表示先钦定 $n$ 个,再统计钦定情况如此的方案数,其中会包含重复的方案,因为一个方案可以有多种钦定情况。具体地,对于恰好选择 $i$ 个,钦定情况数位 $i\choose n$ ,故 g(i) 在 $f(i)$ 中被计算了 $i\choose n$ 次。切勿将 $f(n)$ 来理解为普通的后缀和。

例题

[bzoj2839]集合计数

题目大意

一个有 $n$ 个元素的集合有 $2^n$ 个不同子集(包含空集),现在要在这 $2^n$ 个集合中取出至少一个集合,使得它们的交集的元素个数为 $k$ ,求取法的方案数模 $10^9+7$ 。

$1\le n\le 10^6$ ,$0\le k\le n$ 。

题解

对于稍有组合数学基础的人,通过直觉很容易列出式子 ${n\choose i}(2^{2^{n-i}}-1)$ 。即钦定 $i$ 个交集元素,则包含这 $i$ 个的集合有 $2^{n-i}$ 个;每个集合可选可不选,但不能都不选,由此可得此方案数。

接下来考虑上式与所求的关系:设 $f(i)$ 表示钦定交集元素为某 $i$ 个的方案数, $g(i)$ 表示交集元素恰好为 $i$ 个的方案数,则 ${n\choose k}(2^{2^{n-k}-1})=f(k)=\sum\limits_{i=k}^n{n\choose i}g(i)$ 。

通过二项式反演求出 $g(k)=\sum\limits_{i=k}^n(-1)^{i-k}{i\choose k}f(i)=\sum\limits_{i=k}^n(-1)^{i-k}{i\choose k}{n\choose i}(2^{2^{n-i}}-1)$ 。

使用一些预处理手段,时间复杂度 $O(n)$ 。

[bzoj3622]已经没有什么好害怕的了

题目大意

给出两个长度均为 $n$ 的序列 $A$ 和 $B$ ,保证这 $2n$ 个数互不相同。现要将 $A$ 序列中的数与 $B$ 序列中的数两两配对,求 “ $A>B$ 的对数比 $A<B$ 的对数恰好多 $k$ ” 的配对方案数模 $10^9+9$ 。

题解

显然当 $n-k$ 为奇数时必然无解;当 $n-k$ 为偶数时,$A>B$ 的对数恰好为 $\frac{n+k}2$ ,记 $m=\frac{n+k}2$ 。

由于 “恰好” 这一限制不容易处理,考虑将其转化为 “钦定” 限制,进而通过二项式反演来处理。

先将 $A$ 和 $B$ 从小到大排序,设 $dp(i,j)$ 表示考虑了 $A$ 的前 $i$ 个数,钦定了 $j$ 对 $A>B$ 的方案数。

讨论 $A_i$ 的配对情况:若不配对,则方案数为 $dp(i-1,j)$ ;若配对,记 $B$ 中比 $A_i$ 小的数的个数为 $cnt(i)$ ,则方案数为 $dp(i-1,j-1)\times (cnt(i)-(j-1))$ 。

故 $dp(i,j)=dp(i-1,j)+dp(i-1,j-1)\times(cnt(i)-(j-1))$ 。

设 $f(i)$ 表示钦定 $i$ 对 $A>B$ 的方案数,$g(i)$ 表示恰好 $i$ 对 $A>B$ 的方案数,则 $(n-m)!\times dp(n,m)=f(m)=\sum\limits_{i=m}^n{i\choose m}g(i)$ 。

故 $g(m)=\sum\limits_{i=m}^n(-1)^{i-m}{i\choose m}f(i)=\sum\limits_{i=m}^n(-1)^{i-m}{i\choose m}(n-i)!\times dp(n,i)$ 。

时间复杂度 $O(n^2)$ 。

[bzoj4710]分特产

题目大意

有 $n$ 个人和 $m$ 种物品,第 $i$ 种物品有 $a_i$ 个,同种物品之间没有区别。现在要将这些物品分给这些人,使得每个人至少分到一个物品,求方案数模 $10^9+7$ 。

题解

对于多种物品的情况,“每个人至少分到一个物品” 是一个非常棘手的条件,考虑将其转化为 “恰好 $0$ 个人没有分到物品” ,并用二项式反演来解决。

设 $f(i)$ 表示钦定 $i$ 个人没有分到物品的方案数,$g(i)$ 表示恰好 $i$ 个人没有分到物品的方案数,则在 $f(t)$ 中,对于第 $i$ 种物品,分配时相当于 $a_i$ 个物品分给 $n-t$ 个人,方案数为 ${n-t+a_i-1\choose a_i-1}$ , 于是 ${n\choose t}\prod\limits_{i=1}^m{n-t+a_i-1\choose a_i-1}=f(t)=\sum\limits_{i=t}^n{i\choose t}g(i)$ 。

故 $g(t)=\sum\limits_{i=t}^n(-1)^{i-t}{i\choose t}f(i)=\sum\limits_{i=t}^n(-1)^{i-t}{i\choose t}{n\choose i}\prod\limits_{j=1}^m{n-i+a_j-1\choose a_j-1}$ 。

最终的答案 $g(0)=\sum\limits_{i=0}^n(-1)^i{n\choose i}\prod\limits_{j=1}^m{n-i+a_j-1\choose a_j-1}$ 。

时间复杂度 $O(n^2+nm)$ 。

原文地址:https://www.cnblogs.com/GXZlegend/p/11407185.html

时间: 2024-11-08 03:57:22

二项式反演及其应用的相关文章

二项式反演

问:给你k种颜色,你必须用上所有颜色去涂满n个相邻的格子,并且要求相邻格子的颜色不同,求方案数. 我们设必须用 i 种颜色两两不相邻的涂格子的方案数为 b(i) ; 很明显: ,我们令 a(k)=k·(k-1)n-1 , 然后有. 如果你知道二项式反演的话,那么这个问题就已经解决了,因为. 是不是觉得二项式反演很厉害,下面我将给出它的证明. 二项式反演公式: 证明: 然后让我们对进行分析: 我们预热一下: 有A,B,C,D,E,F,G 7个人,我们要先从中选出4个候选人,再从中选出3个作为mas

2014ACM/ICPC亚洲区西安站现场赛 F color(二项式反演)

题意:小球排成一排,从m种颜色中选取k种颜色给n个球上色,要求相邻的球的颜色不同,求可行的方案数,答案模1e9+7.T组数据,1<= n, m <= 1e9, 1 <= k <= 1e6, k <= n, m 分析: a(k)表示用不超过k种颜色染n个位置,两两相邻颜色不相同的总数,很简单a(k)=k(n-1)^(k-1) b(k)表示恰好用k种颜色 很显然a(k)=ΣC(k,i)b(i),我们知道a,想知道b,这里就用到二项式反演 那么b(k)=ΣC(k,i)*i*(-1)

二项式反演学习笔记

这是一篇防遗忘的二项式反演证明博客 在此不给出精妙的容斥证明,开始推代数证明 众所周知二项式反演有两个形式 \(f(n) = \sum_{i = 0}^{n} (-1)^{i}\binom{n}{i}g(i) \Leftrightarrow g(n) = \sum_{i = 0}^{n} (-1)^{i} \binom{n}{i}f(i)\) 这个式子简直妙啊--太对称了 然而它更常用的形式是这个 \(f(n) = \sum_{i = 0}^{n}\binom{n}{i}g(i) \Leftri

Luogu4859 二项式反演

今天学了一个叫二项式反演的有趣东西. 其实它的核心式子就两个 若\(g_i=\sum_{j=i}^n\binom{j}{i}f[j]\) 那么\(f_i=\sum_{j=i}^n(-1)^{j-i}\binom{j}{i}g[j]\) 证明是用容斥证的. 现在我们看这道题. 题目链接 我们知道答案就是\(a>b\)的对数为\(\frac{n+k}{2}\)的方案数. 令\(x=\frac{n+k}{2}\) 考虑普通\(dp\). 用\(f[i][j]\)表示前\(i\)个数,已经有\(j\)对

[bzoj3622]已经没有什么好害怕的了——容斥or二项式反演+DP

题目大意: 给定两个长度为\(n\)的序列,求有多少种匹配方式,使得\(a_i<b_i\)的个数恰好为\(k\)个. 思路: 据说是一道二项式反演的经典例题了. 首先如果要求正好等于\(k\)个的是不太好求的,我们可以考虑求出至少为\(k\)个的方案数. 首先先把两个序列都按照从小到大的顺序排好序,然后以序列\(b\)为对象dp. 我们设\(f_{i,j}\)表示前\(i\)个数里面强制确定了\(j\)个\(a_i<b_i\)关系的方案数,记\(c_i\)表示在\(a\)中有多少个数<\

CF gym 101933 K King&#39;s Colors —— 二项式反演

题目:http://codeforces.com/gym/101933/problem/K 其实每个点的颜色只要和父亲不一样即可: 所以至多 i 种颜色就是 \( i * (i-1)^{n-1} \),设为 \( f(i) \),设恰好 i 种颜色为 \( g(i) \) 那么 \( f(i) = \sum\limits_{j=0}^{i} C_{i}^{j} * g(j) \) 二项式反演得到 \( g(i) = \sum\limits_{j=0}^{k} (-1)^{k-j} * C_{k}

UVAlive-7040 color(组合数学,二项式反演)

链接:vjudge 题目大意:有一排方格共 $n$ 个,现在有 $m$ 种颜色,要给这些方格染色,要求相邻两个格子的颜色不能相同.现在问恰好用了 $k$ 种颜色的合法方案数.答案对 $10^9+7$ 取模.$T$ 组数据. $1\le T\le 300,1\le n,m\le 10^9,1\le k\le 10^6,k\le \min(n,m)$.大多数数据中 $k$ 很小.(smg啊……) 经典的二项式反演例题. 我们令 $f(x)$ 为一共有 $x$ 种颜色,恰好用了 $x$ 种颜色的方案数

二项式反演与错排问题

二项式反演与错排问题 常见简单组合恒等式: \(C_n^m=C_n^{n-m}\) \(C_n^m=C_n^{m-1}+C_{n-1}^{m-1}\) \(\sum_{i=0}^{n}C_n^i=2^i\) \(\sum_{i=0}^{n}(-1)^i*C_n^i=[n=0]\) 3.4.证明:由二项式定理易证. 令\(x=1,y=1\),可得3式 令\(x=1,y=-1\), 可得4式 二项式反演: 假设存在两个函数f,g.满足: \[ f_n=\sum_{i=0}^{n}C_n^i*g_i

[bzoj4665]小w的喜糖_二项式反演

小w的喜糖 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=4665 数据范围:略. 题解: 二项式反演裸题. $f_{i,j}$表示,前$i$种钦定$j$拿到自己种类糖果的方案数. 求完了之后可以二项式反演回来即可. 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll; const int mod = 1000000009 ; int n, m; ll