这里提供一道 CodeForces 上一道类似题目的题解
容斥
假设这里有一些元素,每个元素用 e 表示,每个元素可能在多个 Xi 集合中,总共有 n 个集合
令 X 是所有 Xi 的集合,
我们要求出元素的数量,也就是 ∣⋃i=1nXi∣
∣i=1⋃nXi∣=Y⊆X∑(−1)size(Y)∣e∈Y⋂e∣
其中,size(Y) 代表 Y 包含了几个 X 中的元素,也就是几个 Xi
CF559C - Gerald and Giant Chess
题意
给出一个 H(H≤105) 行 W(W≤105) 列的棋盘
棋盘上有 n(n≤2000) 个格子是黑色的
在棋盘左上角有一个卒,每一步可以向右或者向下走一格,并且不能移动到黑色格子中
求:这个卒从左上角移动到右下角,一共有多少种可能的路线
思路(若 n≤20)
ans= 总方案数 − 经过黑色格子的方案数
总方案数 =∁H+WH
容斥
我们设 e 是一种从起点到终点,至少经过一个黑色格子的方案,经过黑色格子的方案数就是 e 的数量
Xi 是从起点出发,一定经过 i 号黑点,到达终点的方案。显然如果某一种方案 e 经过了 i 号黑点,那么 e∈Xi
容斥的过程
我们状压枚举 Xi(就相当于枚举公式中的 Y)
如果枚举到的 Y={Xp,Xq,Xr},对应的黑点编号就是 p,q,r,交换它们的顺序,使得存在路径能顺利按顺序走完 p→q→r,此时计算 {Xp,Xq,Xr} 的交集,即: ∣⋂e∈Ye∣=起点→p→q→r→终点 的方案数
思路(若 n≤2000)
ans=∑i=1n 起点到 i 号黑点的方案数(但不经过其它黑点) × i 号黑点到终点的方案数
将所有黑点以行号为第一关键字,列号为第二关键字排序
令 fi= 从起点到 i 号黑点,但不经过 1~i−1 号黑点的方案数
fi=fj⋅∁xi−xj+yi−yjxi−xj,j<i 且黑点 j 可以到达黑点 i
ans=∑fi⋅∁H−xj+W−yjH−xj