容斥
题目引入
空谈容斥原理,容斥公式实际上并没有什么卵用。。。(所以我把以前那篇删掉了,我自己也看不懂我写的啥)
[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\) 个人的答案为:
依照乘法原理,总答案为:
考虑去掉有人没有被分配的情况(观察到很难正面计算,所以从反面考虑)。
设 \(f(k)\) 表示强制让 \(k\) 个人为 \(%\)\(0\),其它选不选任意(即至少选 \(k\) 个为 \(0\))的方案数,则有:
简单解释:本质上就是将人数减少 \(k\) 个,再乘上从 \(n\) 个人中选择 \(k\) 个的组合系数(注意到每个人不同)。
那不合法答案数就是 \(f(1\cdots k)\) 的并集了。
那这个并集怎么算呢,下面开始先进行感性推导:
先减去 \(f(1)\) ,但发现 \(f(1)\) 包含 \(f(2)\) 的情况,减多了,加上 \(f(2)\),然后 \(f(2)\) 中又存在 \(f(3)\) 的情况,加多了,再减去 \(f(3)\),\(\cdots\)。以此类推,\(f(n)\) 当然没有重复情况,结束计算。
得出公式:
这就是容斥的基本公式变形。
容斥时间复杂度
如果我们关心最终选择的具体方案,那容斥的实际时间复杂度一般为 \(O(2^n)\),也就是子集数量。由于这是一般容斥的时间复杂度,所以我居然产生了容斥就是 \(O(2^n)\) 的刻板印象。
实际上,对于一些题目,容斥状态可以被合并。比如上面的例题,虽然 \(n\) 个人互不相同,但不管选哪 \(k\) 个都不会影响最终答案,所以乘上组合系数即可。
类似的例题
满射
\(m\) 个不同的物品放入 \(n\) 个不同的盒子中,要求每个盒子不为空的方案数。
注意不能用隔板法,因为都是不同的。
还是考虑不合法的答案,设 \(f(k)\) 表示至少有 \(k\) 个为空的答案,则有:
同理进行容斥:
错排
\(n\) 个物品放入 \(n\) 个盒子,每个盒子放一个,问第 \(i\) 个物品都不放入第 \(i\) 个盒子的方案数。
还是考虑不合法,设 \(f(k)\) 表示有 \(k\) 个放到自己的盒子中的答案,则有:
同理进行容斥:
总结
考虑容斥,一般是正面不行,减去反面。而容斥的每一个状态都是好求的(如:至少 \(k\) 个),而容斥后的结果都是难求的(如:恰好 \(k\) 个)。
容斥时间复杂度可合并,只有要考虑每一种容斥的具体方案的才可能是 \(O(2^n)\)。
对于 OI 的基本公式:
其中 \(f(k)\) 表示一种好求的简单状态,通常表现为:至少,保证,一定。但不是恰好,刚刚。

浙公网安备 33010602011771号