容斥+计数的练习(长期更新)
菜就多练。
朴素的容斥原理应用
I.P1450 [HAOI2008] 硬币购物
Q:
共有 \(4\) 种硬币。面值分别为 \(c_1,c_2,c_3,c_4\)。
某人去商店买东西,去了 \(n\) 次,对于每次购买,他带了 \(d_i\) 枚 \(i\) 种硬币,想购买 \(s\) 的价值的东西。请问每次有多少种付款方法。
Sol:
找到限制:硬币的数量\(d_i\)。
考虑没有限制的情况:就是完全背包。
那么对硬币的数量套容斥原理,钦定有\(i\)种硬币的数量不符合限制,其他硬币随便(做完全背包)。那么将钦定的部分从\(s\)中减去,剩下的部分就是完全背包。然后对这个东西上容斥系数,那么就是和钦定的种数\(i\)相关,为\((-1)^i\)。
完全背包部分可以在多测前预处理,于是一次询问中只有对\(4\)种硬币容斥算贡献的复杂度,显然可以接受。
II.P5505 [JSOI2011] 分特产
Q:
\(n\)个有标号盒子和\(m\)种有标号球,第\(k\)种球有\(s_k\)个(这之中无标号),每个盒子中至少放一个球。问方案数。
Sol:
找到限制是“每个盒子中至少放一个球”。
考虑没有限制的情况,对于每种球来说,就是无标号球放到有标号盒子中,盒子可以为空,直接插板法。对于每种球就直接乘起来(因为分步在做)。
于是对这个限制进行容斥。设当前钦定有\(k\)个盒子为空,其他任意,这个方案数为\(f_k\)。那么套上容斥系数,\(ans=\sum\limits_{k}(-1)^kf_k\)。
如何证明这个容斥是对的?
考虑一种有\(k\)个盒子为空的方案,我们希望它被计数\([k=0]\)次。考虑它在哪些地方被计数了。对于钦定有\(i\)个盒子为空的情况,它被计数了\((-1)^i\dbinom ni\dbinom {n-i}{k-i}\)次。
那么对\(i\)求和,就可以得到它被计数的次数:
当\(k=0\)时,\(\dbinom nk=1\)。所以这个方案被计数了\([k=0]\)次,是正确的。
回归主线,如何求\(f_i\)?
根据定义,首先选出\(i\)个盒子钦定为空,这是\(\dbinom ni\)。然后对于任意一种小球\(k\),放入可以为空的其余\(n-i\)个盒子中,那么就是\(\dbinom{s_k+n-i-1}{n-i-1}\)。这是分步的,那么对于所有种类的小球,贡献为\({\large\prod}\limits_{k}\dbinom{s_k+n-i-1}{n-i-1}\)
所以\(f_i=\dbinom ni {\large\prod}\limits_{k}\dbinom{s_k+n-i-1}{n-i-1}\)。
于是就可以求了。
计数DP
练好DP就好了,所以去DP吧。

浙公网安备 33010602011771号