容斥

容斥原理

-1型

首先是简单的容斥,即不含系数,直接为总方案减不合法方案
这类问题常常设出 dp 表示合法的方案数,转移时对于 i 枚举 j,令 j 是合法部分,而 ij 的部分则是随意填


C. 放棋子

也是一样的,只不过是放到了二维上
f[p][i][j] 表示第 p 种棋子占了 ij 列的方案数
那么转移为总方案数-f[p][x][y](ix)(jy)
注意这里的 i=xj=y 不能同时满足


BZOJ4361 isn

首先统计出长度为 i 的不降子序列数量,这个直接设 g[i][j][k] 表示前 i 数取 j 个且最后一个数为 k 的方案数,由于每次只需要转移 ai,可以用树状数组优化到 n2log

如果将答案统计为 fii! 会有问题,因为题目限定达到目标后立即停止,那么相当于此时求的 fi 的答案,需要减去 i+1 的答案才行,由于从 i+1i 共有 i+1 种选法,乘到系数上即可


奇减偶加型

经典的容斥式是奇减偶加


B. 数树

容斥后的计算式发现是 (nk)!,其中 k 为链数
可以发现这个表达式是单一的,那么考虑对于相同的 i 的贡献一起算,跑一个树形背包


AT3728 [ARC087D] Squirrel Migration

首先肯定是多次经过重心的模式
考虑统计方案数,运用容斥,计算出 fi 表示至少 i 个不合法的
那么 ans=(1)ifi(ni)!
对于每一棵子树,若有 i 个不合法的,那么贡献 (si)2i!,把这个背包进去即可


AT3981 [ARC093D] Dark Horse

获胜的条件是那 m 个人均不是需要 pkn 轮中的获胜者
考虑容斥,强制集合 S 的获胜者是关键点
状压去求
考虑将 m 个人从大往小插入
那么两种转移,一种放进以前的堆 f[i][S]=f[i1][S]
另一种新开一个,加入比 ai 大的数(这是从大往小的优势就显现出来了)
f[i][S]=f[i1][S](allSai2j)(2j)!
同时另一个巧合是状态为 S 中恰好有 S 个点


AT5149 [AGC036F] Square Constraints

式子最大的作用其实就是提供了上下界单调的性质以及一些巧合,因此没必要在公式上下功夫

可以结合实际意义,相当于是两个同心圆中的圆环部分作为限制

有两个限制怎么计算?

这让我们想到容斥,因为任何一个单独的限制都是平凡的

于是现在去计算强制一些点选择内圆作为上边界,其余都只有外圆作为上边界限制的方案数

写出来如果只有上界的表达式:

对于一组单增的 r,方案为 (rii+1)

考虑把这个式子融进 dp 里,可以发现 iri 的排名,那么也就是说只需要知道某一种方案下上界的一种顺序即可

但是容斥肯定不能去枚举子集,那么只能将某一个值的方案一起计算

那么这个排名也需要动态计算

这时候就又有巧合了:对于 [0,n) 中选择外圆作为上界的,一定在 [n,2n) 之后

那么可以按照内圆/外圆的边界作为关键字对左右两侧混合排序,这样无论左边怎样决策,对于每一个组的相对大小是没有任何影响的

f[i][j] 表示前 i 个选 j 个的方案数,可以发现 dp 到每一个点的时候排名是水到渠成的(其中还有固定外层的 k 的功劳),可以愉快地转移啦!


ABC216H

题意: 有 n 个机器人排成一排,有 m 个时刻,每个时刻每个机器人有 1/2 的概率向右走一步,有 1/2 的概率在原地不动,问所有机器人不相撞的概率

首先转化为统计方案数
考虑相撞问题的一种常见解决方式——不管
于是枚举排列,容斥系数为逆序对数奇偶性
表达式为 (myixi)
直接枚举排列肯定行不通
那么改为按顺序加入+状压的模式即可


图的计数


  • 建造游乐园

n 个点的欧拉图数量

欧拉图等于度数为偶数的图减去不连通的图
度数为偶数,可以先拿出一个点用来调和,剩下的随意连边,最后一个点总能补成偶数度
那么 gi=2(n2)
考虑 f 的转移:fi=gifjgij(i1j1)
即拿出来一部分强制不连通,剩下的随意,组合数用来表示任意选点


hdu4997 Biconnected

题意:一些边不能选,其余的边有多少种选择方式使得整张图构成边强连通图。

考虑按照连通图计数的朴素容斥来统计

fS 表示 S 形成的总图数,gS 表示 S 形成的连通图数,hS 表示 S 形成一个边双的数量,dpS,T 表示 ST 进行连边形成边双的方案数

那么 hS=gShTdpT,ST

dpS,T=totS,igidpS,Ti

注意其中所有的转移一定要保证 lowbit 包含于枚举的子集中


C. 题目交流通道

沿用类似的思路,详见 这里


uoj37 主旋律

题意:无向图有多少边的子集删去之后整个图仍然强联通

仍然不能直接计算,需要统计不是强连通的数量

首先考虑一种暴力的方式是枚举所有缩点后 DAG 的样子,然后统计每个大点形成强连通的方案数

于是问题在于怎样统计合法 DAG 的数量

注意到 DAG 和无向图并不一样,并不能寻找到一个明显的分割点

那么考虑枚举所有无出度的点,但是无法保证另一个集合中都有出度,需要进行一个集合容斥

fS=(1)|T|12edgef[ST]

考虑进行优化,发现并没有必要枚举 DAG,可以直接在图中 dp 整个式子的容斥系数即可


ARC105F Lights Out on Connected Graph

题意为二分图计数
可以发现其实限制条件是有两个的:二分图以及图连通
图连通按照套路是需要通过容斥解决的,考虑二分图的个数怎样计算
如果枚举两个子集,子集间随意连边,可以保证是二分图,但是注意会算重
但是并不是完全不对,考虑我们计算出的这个东西是什么
可以发现一个有 i 个连通块的二分图会被计算 2i
这其实二分图的合法染色方案数!!!
那么把它放进容斥的机器,计算出来的就理应就是一个连通二分图的染色方案
直接愉快地除以二就好啦


人类补完计划

基环树计数,并有权值为 2
首先这个环肯定烦人嘛,先 dp 出环的个数
直接容斥是很混乱的,需要钦定出一个环上的最小点作为起点
那么每次扩展的时候都需要保证点大于这个起点即可
fS 表示 S 是基环树的方案数
那么 fS=gS(1)|T|fSTE(T,ST)
最终的答案为 ansS=(1)|T|2|S||T|fSTE(T,ST)


从上面的分析可以看出,即使是在集合的背景下,采用哪种容斥方式需要结合具体情况来判断,关键在于枚举的集合情形是否有交


二项式反演

本质上是一种特殊的容斥,把容斥系数套路化
这个科技一般的使用情境是题目中询问“恰好 k 个”的方案数,然而在 dp 或使用组合数时不能很好保证个数

以下是用到的公式:
至少:

f(n)=i=n(in)g(i)

g(n)=i=n(1)in(in)f(i)

至多:

f(n)=i=0n(ni)g(i)

g(n)=i=0n(1)ni(ni)f(i)


P6478 [NOI Online #2 提高组] 游戏

这就是一个比较难受的情况,因为普通的树形 dp 状态只能保证手动匹配的点对匹配上了,而剩余的点并不知道是否匹配
也就是说,这题的树形背包其实天然地求解的就是“至少”
f[u][k] 表示 u 子树中至少 k 个匹配的方案数
f[u][k]=f[u][i]×f[v][ki]
f[u][j+1]=f[u][j](s[id]j)
然后套式子就好了


CF1228E Another Filling the Grid

将反演扩展到二维,满足如下关系:
fi,j=x=iy=j(1)xi+yjgx,y
考虑求 gi,j 表示至少 ij 列不满足
那么 gi,j=(ni)(mj)(k1)n2(ni)(nj)k(ni)(nj)


CF997C Sky Full of Stars

首先要求所有行列都不同的颜色的方案数
一样的套路,gi,j 表示至少 ij 列相同
那么 gi,j=(ni)(nj)3(ni)(nj)+1
gi,0=(ni)3i+n(ni)
g0,0=3n2

然后开始大力推式子,还是不推了吧
巨佬的推导


B. Silhouette

详见 这里
可以发现其推导的本质还是二项式反演
但是这个排序的转化非常巧妙


tricks

"1"的转化

degi=2m1,可以把每个点的权值设为 2degi,使得部分点贡献变为了全局点贡献,比如 这个

一条链上 边-点=1,比如 这个

posted @   y_cx  阅读(256)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示