結果

問題 No.2958 Placing Many L-s
ユーザー 👑 binap
提出日時 2024-10-22 05:26:21
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 160 ms / 2,000 ms
コード長 2,093 bytes
コンパイル時間 328 ms
コンパイル使用メモリ 82,432 KB
実行使用メモリ 81,664 KB
最終ジャッジ日時 2024-11-08 20:50:34
合計ジャッジ時間 5,823 ms
ジャッジサーバーID
(参考情報)
judge5 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 29
権限があれば一括ダウンロードができます

ソースコード

diff #

def solve():
    n, m = map(int, input().split())
    FLIP = False

    def v2(x):
        res = 0
        while x % 2 == 0:
            res += 1
            x //= 2
        return res

    if v2(n) + v2(m) <= 2:
        print("-1")
        return

    if v2(n) > v2(m):
        n, m = m, n
        FLIP = True

    cnt = 0
    a = [[0] * m for _ in range(n)]
    B = [[1, 1, 1, 2], [1, 2, 2, 2]]

    def set_B(si, sj):
        nonlocal cnt
        for di in range(2):
            for dj in range(4):
                a[si + di][sj + dj] = cnt + B[di][dj]
        cnt += 2

    C = [
        [1, 1, 3, 3, 3, 4, 6, 6],
        [1, 2, 3, 4, 4, 4, 5, 6],
        [1, 2, 2, 2, 5, 5, 5, 6]
    ]

    def set_C(si, sj):
        nonlocal cnt
        for di in range(3):
            for dj in range(8):
                a[si + di][sj + dj] = cnt + C[di][dj]
        cnt += 6

    # case (II)
    if v2(n) >= 1 and v2(m) >= 2:
        k = n * m // 4
        for i in range(n // 2):
            for j in range(m // 4):
                set_B(i * 2, j * 4)
        print(k)
        if FLIP:
            a_old = [[0] * n for _ in range(m)]
            for i in range(n):
                for j in range(m):
                    a_old[j][i] = a[i][j]
            a, n, m = a_old, m, n
        for row in a:
            print(" ".join(map(str, row)))
        return

    # case (III)
    if v2(n) == 0 and v2(m) >= 3:
        if n == 1:
            print("-1")
            return
        k = n * m // 4
        for i in range(n // 2 - 1):
            for j in range(m // 4):
                set_B(i * 2, j * 4)
        for j in range(m // 8):
            set_C(n - 3, j * 8)
        print(k)
        if FLIP:
            a_old = [[0] * n for _ in range(m)]
            for i in range(n):
                for j in range(m):
                    a_old[j][i] = a[i][j]
            a, n, m = a_old, m, n
        for row in a:
            print(" ".join(map(str, row)))
        return

    assert False


def main():
    t = int(input())
    for _ in range(t):
        solve()


if __name__ == "__main__":
    main()
0