みんプロ2019 E - Odd Subrectangles
考察
行列に $(0,1)$—ベクトルを掛けていくつかの行・列を取り出すことなどを考えると、問題は次のように言い換えられます。
$N \times M$ の $\mathbb{F}_2$ 行列 $A$ が与えられる。$vAw=1$ であるような行ベクトル $v \times \mathbb{F}_2^N$ と列ベクトル $w \in \mathbb{F}_2^M$ の組の個数を求めよ。
$vA=0$ の場合、条件を満たす $w$ は明らかに $0$ 個です。$vA\neq0$ の場合には、条件を満たす $w$ は全体の半分である $2^{M-1}$ 個になります($vA$ のある非零成分の位置に対応する $w$ の成分は、それ以外を任意に決めると自動的に定まる)。
$r=\mathrm{rank} A$ とおくと、次元定理より $vA=0$ となる $v$ の個数は $2^{N-r}$ となり、答えは $(2^N-2^{N-r})2^{M-1}$ です。掃き出し法はこの方法が簡単です。
xor の掃き出しすごい簡単に出来るんですね
— 熨斗袋 (@noshi91) November 30, 2019
vector<int> basis;
for(int e : a){
for(int b : basis)
chmin(e, e ^ b);
if(e)
basis.push_back(e);
}
これで数列 a の基底が basis に入る
別解
無理やり関連させると、$vAw$ を考える代わりに $(vP^{-1})(PAQ)(Q^{-1}w)$ を考えてもよい、ということになりそう。