容斥

题目引入

空谈容斥原理,容斥公式实际上并没有什么卵用。。。(所以我把以前那篇删掉了,我自己也看不懂我写的啥)

[JSOI2011] 分特产

\(m\) 种物品,每种物品有 \(a_i\) 个,把所有物品分给 \(n\) 个不同的人,且每个人必须至少被分得 \(1\) 个的方案数。

例:\(n=2\)\(m=2\)\(a=\{2,1\}\)

方案:

\(\{1,1\}\)\(\{2\}\)

\(\{1\}\)\(\{1,2\}\)

\(\{2\}\)\(\{1,1\}\)

\(\{1,2\}\)\(\{1\}\)

先不考虑每个人必须至少被分得 \(1\) 个的限制。

将每个物品进行分配,依照隔板法,物品 \(i\) 分给 \(n\) 个人的答案为:

\[\binom{a_i+n-1}{n-1} \]

依照乘法原理,总答案为:

\[\prod_{i=1}^m\binom{a_i+n-1}{n-1} \]

考虑去掉有人没有被分配的情况(观察到很难正面计算,所以从反面考虑)。

\(f(k)\) 表示强制让 \(k\) 个人为 \(%\)\(0\),其它选不选任意(即至少\(k\) 个为 \(0\))的方案数,则有:

\[f(k)=\binom{n}{k}\prod_{i=1}^m\binom{a_i+n-k-1}{n-k-1} \]

简单解释:本质上就是将人数减少 \(k\) 个,再乘上从 \(n\) 个人中选择 \(k\) 个的组合系数(注意到每个人不同)。

那不合法答案数就是 \(f(1\cdots k)\) 的并集了。

那这个并集怎么算呢,下面开始先进行感性推导:

先减去 \(f(1)\) ,但发现 \(f(1)\) 包含 \(f(2)\) 的情况,减多了,加上 \(f(2)\),然后 \(f(2)\) 中又存在 \(f(3)\) 的情况,加多了,再减去 \(f(3)\)\(\cdots\)。以此类推,\(f(n)\) 当然没有重复情况,结束计算。

得出公式:

\[\sum_{k=0}^{n}(-1)^kf(k) \]

这就是容斥的基本公式变形。

容斥时间复杂度

如果我们关心最终选择的具体方案,那容斥的实际时间复杂度一般为 \(O(2^n)\),也就是子集数量。由于这是一般容斥的时间复杂度,所以我居然产生了容斥就是 \(O(2^n)\) 的刻板印象。

实际上,对于一些题目,容斥状态可以被合并。比如上面的例题,虽然 \(n\) 个人互不相同,但不管选哪 \(k\) 个都不会影响最终答案,所以乘上组合系数即可。

类似的例题

满射

\(m\) 个不同的物品放入 \(n\) 个不同的盒子中,要求每个盒子不为空的方案数。

注意不能用隔板法,因为都是不同的。

还是考虑不合法的答案,设 \(f(k)\) 表示至少有 \(k\) 个为空的答案,则有:

\[f(k)=\binom{n}{k}(n-k)^m \]

同理进行容斥:

\[\sum_{k=0}^{n}(-1)^kf(k) \]

错排

\(n\) 个物品放入 \(n\) 个盒子,每个盒子放一个,问第 \(i\) 个物品都不放入第 \(i\) 个盒子的方案数。

还是考虑不合法,设 \(f(k)\) 表示有 \(k\) 个放到自己的盒子中的答案,则有:

\[f(k)=\binom{n}{k}(n-k)! \]

同理进行容斥:

\[\sum_{k=0}^{n}(-1)^kf(k) \]

总结

考虑容斥,一般是正面不行,减去反面。而容斥的每一个状态都是好求的(如:至少 \(k\)),而容斥后的结果都是难求的(如:恰好 \(k\))。

容斥时间复杂度可合并,只有要考虑每一种容斥的具体方案的才可能是 \(O(2^n)\)

对于 OI 的基本公式:

\[\sum_{k=0}^{n}(-1)^kf(k) \]

其中 \(f(k)\) 表示一种好求的简单状态,通常表现为:至少,保证,一定。但不是恰好,刚刚。

posted @ 2026-08-30 22:17  Denia-kawaii  阅读(9)  评论(0)    收藏  举报