Educational Codeforces Round 48 (Rated for Div. 2) D. Vasya And The Matrix
問題概要
要素の数列と、要素の数列が与えられます。
行列の行列で、それぞれの行について、全要素のxorをとるとに、それぞれの列について全要素のxorをとるとになるようなものが存在するならば1つ求めてください。
解法
行う操作がxorなので、全要素を2進数の桁ごとに見て、最後に合算すればよいことがわかります。
ので、これ以降はが0,1からなる数列で、行列も0,1からなるものを求めることだけを考えればよいです。
構築できない条件を探してみます。
0,1からなるということと、xorが絡んでいることから、偶奇に着目します。
すると、数列の総和と、の総和の偶奇が異なる場合、構築できないことがわかります。
数列の各値は、その行に存在している値の総和の偶奇と一致するように構築する必要があります。ということは、の総和は、行列の要素全てに対する総和の偶奇と一致しているはずです。
このことはにも同様のことが言えます。
よって、行列全体の総和の偶奇は、の総和の偶奇と一致していて、かつ、の総和の偶奇と一致している必要があります。
ということで、の総和との総和の偶奇が一致しない場合には構築できないことがわかりました。
では、一致している場合には構築できるかどうか、を見ていきます。
わかりやすく、の総和の偶奇で場合分けをします。
の総和、の総和が奇数の場合
これはすごくシンプルで、の値を決める場合、であれば1
、それ以外なら0
とすればよいです。
の要素が1
の際、その行(列)で1
となっている要素の個数が奇数個になっている必要がありますが、で1
となっている要素の個数が奇数個であるため、上記のような構築をすればよいです。の総和、の総和が偶数の場合
この場合は少々厄介です。
単純な構築ができなかったため、どこかに値を押し付けて、最後に微調整を加えることを考えます。
すると、
を、と一致させる
を、と一致させる
とすると、以外はうまく構築できます。
あとは最後に微調整をすればよく、をとすればよいです。
感想
こんな構築もあるみたいです。すごい。
いやこれ文章に起こしたら普通に正しかった https://t.co/xvelOu9ldK
— かっつ (@_KKT89) 2020年3月15日