Description
题目链接:HDU 6314
对于一个 $n\times m$ 的网格,每个格子只能涂上黑色或白色。求所有涂色方案中,至少有 $A$ 行 $B$ 列为黑色的方案数(对 $998244353$ 取模)。
数据范围:$1\le n,m,A,B\le 3000$
Solution
显然,行和列是相同的,于是我们可以把列去掉,记 $Ans(i)$ 表示至少有 $i$ 行全黑的方案数。
接下来考虑容斥,有以下式子
其中 $f_i$ 是 $Ans(a)$ 所对应的一个未知的容斥系数。
故我们只需要考虑如何求 $f_i$
考虑任意一个选了 $i$ 行且这 $i$ 行全黑的方案在上面的式子里计算的次数(每个方案最后应该只会被计算一次)
尝试推导 $f_i$ 的递推式
故
这样我们就可以在 $O(n^2)$ 的时间内递推出容斥系数。
因为行和列的问题是等价的,所以可以用相同的方法求出列的容斥系数。
记 $Ans(a,b)$ 表示至少 $a$ 行和 $b$ 列全黑的方案数,则有
时间复杂度:$O(n^2+m^2+nm)$
Code
1 |
|
Extended
上述代码的运行时间为 $700\text{ms}$ 左右,考虑如何优化。
此处,我们还是考虑只有行的情况。
如果我们强制有 $b$ 行为黑色,那么它对答案有 $\sum_{i=a}^b C_b^i$ 次的贡献(被计算进答案的次数)。
而事实上,我们想让它的贡献为(系数) $1$,考虑如下公式
故容斥系数为 $(-1)^{i-a}\times C_{i-1}^{a-1}$
通过优化,程序运行时间可以压到 $400\text{ms}$ 左右。
时间复杂度:$O(nm)$
代码
1 |
|