题目描述

有一个 $n*m$ 的 $01$ 矩阵,矩阵中 $k$ 个格子的数已经确定,你需要求出有多少种方案使得矩阵每行每列的异或和均为 $1$。对 $998244353$ 取模。

数据范围


Subtask 1

暴力自不必说

Subtask 2

对于 $k = 0$ 的数据,如何做?

那么我们只要空出一列(或一行或是一行一列),让其它的格子随便填,因为不管怎么样,最后空出的这一列(行)总是可以将整行(列)的异或和变为 $1$

同理 $k <= m$ 的数据找出一个全空的列就好了

Subtask 3

仿照 $Subtask 2$ 的思路,还是找出一个被限制的格子最少的列,令该列被限制的格子数为 $p$,考虑到 $k \le 10m$,故 $p \le 10$,那么对于其它列,只要关注这 $p$ 行以及它们本身列的异或和就好了

考虑使用 $DP$,设 $f_{i, j, k, state}$ 表示前 $i$ 列前 $j$ 行,目前该列的异或和为 $k$,那 $p$ 行的异或情况状压后为 $state$

复杂度 $O (nm2^{\frac{k}{m}})$

Subtask 4

因为状态数太多,考虑能够直接计算的状态数就直接消去

对于除了那 $p$ 行以外还存在不被限制的格子的列,可以空出一个格子,然后其它格子随便填,然后将这些列删去

在删去上述列之前,还要计算它们对于行的贡献

假设在 $p$ 行的其中一行,在上述列中该行总共有 $k$ 个空格,那么同理还是只要留出一个空格其它随便填,故答案要算上 $2^{k - 1}$

那么对于未删去的列只需考虑那 $p$ 行就可以了(因为其它行一定是被限制的),然后仿照 $Subtask 3$ 做 $DP$ 即可

复杂度 $O (\frac{k^2}{nm}2^{\frac{k}{m}})$

感觉整题就是将空一行算异或的思想完全贯彻的说

至于代码,感觉理论上那些存在空格的行 $DP$ 之后不管取其异或为 $0$ 或 $1$ 都是可以的(可惜因为写到心态爆炸然后就放弃了代码的说

(至于考场上连 $Subtask 2$ 都没想出来,只是瞎打了 $k = 0$ 的规律而且还有可能错的我感觉我好菜啊