Official

C - Row Column Sums Editorial by maroonrk_admin


\(A\) の総和と \(B\) の総和が \(\bmod K\) で異なる場合,明らかに答えは不可能です.以下,それ以外のケースを考えます.

まず最初にすべてのマスに \(K-1\) を書き込んだものと考え,そこから数を減らして条件に合わせるようにします.

各行,各列について,\(\bmod K\) でいくら数を減らす必要があるかがわかります.これをそれぞれ \(C_i,D_i\) とおくことにします.

\(Z=\max(\sum_{1 \leq i \leq H} C_i, \sum_{1 \leq i \leq W} D_i)\) とすると,少なくとも \(Z\) の分だけは数を減らす必要があります.

逆にちょうど \(Z\) だけ減らすような解が存在することを示すことができます. よって答えは \(HW(K-1)-Z\) になります. 以下,ちょうど \(Z\) だけ減らす解が存在することを示します.

\(\sum_{1 \leq i \leq H} C_i \equiv \sum_{1 \leq i \leq W} D_i \bmod K\) であることに注意すると,\(C_1\) または \(D_1\) に適当に \(K\) の倍数を足すことで,\(\sum_{1 \leq i \leq H} C_i = \sum_{1 \leq i \leq W} D_i = Z\) とできます.

あとは,以下の手順を \(Z\) 回繰り返せばよいです.

  • \(C_i \geq 1,D_j \geq 1\) を満たす \(i,j\) を見つける. \(i\) 行目 \(j\) 列目の値を \(1\) 減らし,\(C_i,D_j\) の値も \(1\) 減らす.

この時,\(i\) 行目 \(j\) 列目の値が減らされる回数は \(\min(C_i,D_j) \leq K-1\) で抑えられるため,負の値が書き込まれるようなこともありません. よって示されました.

解答例(pypy3)

posted:
last update: