CF1672G Cross Xor 题解

给出一个 \(r\times c\) 的网格图,上面有 01,你要将 换成 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\)
  • 反之亦然。

  然后就解决了。

posted @ 2022-05-03 11:25  Werner_Yin  阅读(65)  评论(0编辑  收藏  举报