AtCoder Grand Contest 016: C - +/- Rectangle

,

http://agc016.contest.atcoder.jp/tasks/agc016_c

$h, w$おきに$- hw$置いてそれ以外$1$にすればいいのではと思ったが、ぜんぜんそんなことはなかった。

solution

$w \mid W \land h \mid H$ならNo。そうでなければYes。 $w \mid W$とし$H = h = 1$と見做して解いてその結果を$H$行並べればよい。 十分大きい数$A$を固定して$0, w, 2w, \dots$項目を$A$とし$w-1, 2w-1, 3w-1, \dots$項目を$-A-1$とする。 総和は$\mathrm{ceil}(\frac{W}{w})A + \mathrm{floor}(\frac{W}{w})(- A - 1)$となる。$O(HW)$。

implementation

#!/usr/bin/env python3
H, W, h, w = map(int, input().split())
if W % w == 0 and H % h == 0:
    print('No')
else:
    swapped = False
    if W % w == 0:
        H, W, h, w, swapped = W, H, w, h, True
    a = [ [ 0 for _ in range(W) ] for _ in range(H) ]
    for y in range(H):
        for x in range(0, W, w):
            a[y][x] = W
        for x in range(w - 1, W, w):
            a[y][x] = - W - 1
    if swapped:
        H, W, h, w = W, H, w, h
        b = a
        a = [ [ 0 for _ in range(W) ] for _ in range(H) ]
        for y in range(H):
            for x in range(W):
                a[y][x] = b[x][y]
    print('Yes')
    for y in range(H):
        print(*a[y])