CF1672G Cross Xor 题解
给出一个 \(r\times c\) 的网格图,上面有
0
,1
,?
,你要将?
换成0
或者1
,然后使得网格图满足:
- 每次选择 \((x, y)\) 令所有 \((i, j), i = x \vee j = y\) 的颜色反转,最后整个网格图可以变成全
0
。求方案数 \(\bmod ~ 998244353\)。\(r, c \le 2000\)。
数学
结论
构造
图论
定义 \(R_i = \oplus_j a_{i, j}, C_j = \oplus_i a_{i, j}\)。
对于 \(r, c\) 都是偶数的情况,我们可以进行如下操作:
- 选择 \((x, y)\)。
- 将所有 \((i, j), i = x \vee j = y\) 的点执行一次操作。
然后我们发现只有 \((x, y)\) 改变了。于是对于任意的网格图都是合法的,于是 ?
可以随便替换,方案为 \(2^{? 个数}\)。
如果 \(r,c\) 有一个是偶数,假设 \(r\) 是偶数,那么我们每次操作会使所有 \(R_i\) 反转,但是 \(C_j\) 不会变化。
一个必要条件是 \(R_i\) 全部相同,假设 \(R_i\) 全部为 \(0\)(非 \(0\) 只要对 \((1, 1)\) 操作一次即可),然后我们可以通过构造方案说明其是充要的:
- 每次选择一个为 \(1\) 的\((x, y)\),然后将 \(i \neq x, y \in \{y, c\}\) 的所有点操作一次,然后我们发现 \(R_i\) 不会发生任何变化,但是 \((x, y)\),\((x, c)\) 反色。
- 因为每个 \(R_i\) 都是偶数,所以将所有 \(y \neq c\) 的 \((x, y)\) 操作完了之后,一定是全 \(0\) 的。
分别计算 \(R_i\) 全 \(0\) 全 \(1\) 的方案数即可。
若 \(r, c\) 全为奇数,那么每次操作会使 \(R_i\) 和 \(C_j\) 全部反转,因此一个必要条件是 \(R_i, C_j\) 全部相同。假设 \(R_i, C_j\) 全部为 \(0\)(非 \(0\) 直接操作 \((1, 1)\) 即可),然后我们可以构造出方案证明其是充要的:
- 每次选择一个集合 \(\{(x, y), (a, y), (a, b), (x, b)\}\),然后操作一次,我们发现只有这几个点全部反色。
- 因为 \(R_i, C_j\) 全部为 \(0\),那么总是可以配对的。
至于方案,考虑建立二分图,对于一个点 \((x, y)\) 为 ?
,那么 \(x\) 向 \(y + n\) 连边。我们对于每个联通块可以抠出一棵生成树,根据经典的套路,这个生成树可以有唯一的方案生成我们要的结果(除了根的值一定是该联通块所有初始值的 \(\rm xor\)),然后考虑非树边,也是可以随便施加的,因此还要将对应方案 \(t = \times 2^{非树边个数}\)。
接着分别计算全 \(0\) 全 \(1\) 的答案(令其为 \(ans_0, ans_1\))。
如果该联通块大小为偶数:
- 初始权值为奇数,那么 \(ans_0 = ans_1 = 0\),这个代表着我们要将偶数个一样的数的 \(\rm xor\) 和为奇数,不可能。
- 否则可以任意设置该块的总体权值,\(ans_0 \gets ans_0\times t, ans1 \gets ans1 \times t\)。
如果该联通块大小为奇数:
- 如果初始权值为偶数,那么代表最后的所有权值都为偶数,于是 \(ans_0 \gets ans_0 \times t, ans_1 \gets 0\)。
- 反之亦然。
然后就解决了。