AtCoder AGC039F Min Product Sum (容斥原理、组合计数、DP)
题目链接 https://atcoder.jp/contests/agc039/tasks/agc039_f 题解 又是很简单的F题我不会。。。 考虑先给每行每列钦定一个最小值 \(a_i,b_j\) ,并假设每行每列的最小值是这个数,且每行每列只需要放 \(\ge\) 这个数的数即可,那么这种情况的价值是 \(\prod^n_{i=1}\prod^m_{j=1}\min(a_i,b_j)\) , 方案数是 \(\prod^n_{i=1}\prod^m_{j=1}(n+1-\max(a_i,b_j))\) 然后我们需要把最小值的限制容斥掉,也就是枚举若干行若干列容斥掉(限制 \(+1\) 同时系数乘以 \(-1\) )。 这样的话直接暴力DP就可以解决。设 \(f[k][i][j]\) 表示当前用 \([1,k]\) 中的数填满了 \(i\) 行 \(j\) 列。转移可以直接枚举不被容斥的行数、不被容斥的列数、容斥的行数、容斥的列数,乘上贡献系数,得到了一个多项式时间复杂度的算法。 但是我们发现这样转移显然很浪费,我们可以把四个变量同时枚举改成分四个阶段依次枚举,这样转移时间复杂度降到了 \(O(n)\) .(注意因为要保证从小到大填数,所以必须先枚举不被容斥再枚举被容斥) 不过这题还挺卡常的……需要 \(O(n^3)\) 预处理一下转移系数,详见代码 时间复杂度 \(O(n^4)