Strorkisのブログ

信憑性については悪しからず

Codeforces 1391D 505

問題

https://codeforces.com/problemset/problem/1391/D

 n m列の01行列 aにおいて、全ての部分偶数長正方行列に含まれる1の数を奇数にするための最小操作回数を求めよ。

解法

 n \leq mとする(そうでない場合は aを転置)。

 n = 1の場合、部分偶数長正方行列は存在しないため 0

 n = 2の場合、 a_{00} + a_{10}の偶奇を決めてしまえば後の列の偶奇は自然に定まるため、2通り試す。
偶奇の状態は、00 or 11、01 or 11であり、どの調整も1回の操作で済む。

 n = 3の場合、 a_{00} + a_{10} a_{10} + a_{20}の偶奇を決めてしまえば後の列の偶奇は自然に定まるため、4通り試す。
偶奇の状態は、000 or 111、001 or 110、010 or 101、011 or 100であり、どの調整も1回の操作で済む。

 n \geq 4の場合、 4 \times 4の正方行列が必ず含まれ、それに含まれる4つの 2 \times 2の正方行列とそれ自身は同時に条件を満たすことができないので -1

コード

https://codeforces.com/contest/1391/submission/89863543

一言

自力ACではないが、久しぶりに書いてみたくなったので書いた。