結果

問題 No.3677 Global Checksum
コンテスト
ユーザー harurun
提出日時 2026-08-11 04:52:44
言語 PyPy3
(7.3.23 + ACL)
コンパイル:
pypy3 -mpy_compile _filename_
実行:
pypy3 _filename_
結果
AC  
実行時間 166 ms / 200 ms
+ 223µs
コード長 4,098 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 248 ms
コンパイル使用メモリ 95,948 KB
実行使用メモリ 174,252 KB
最終ジャッジ日時 2026-09-05 13:51:59
合計ジャッジ時間 12,934 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge3_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 20
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

import sys
import pypyjit
from __pypy__ import builders

pypyjit.set_param(
    threshold=200,
    function_threshold=50,
    trace_eagerness=2,
)

MASK = 0xFFFFFFFF


# A_ij <= 10^9 なので最大10桁。
# ループを完全に消している。
def read_num(d, p):
    x = d[p] - 48
    p += 1

    c = d[p]
    p += 1
    if c < 48:
        return x, p
    x = x * 10 + c - 48

    c = d[p]
    p += 1
    if c < 48:
        return x, p
    x = x * 10 + c - 48

    c = d[p]
    p += 1
    if c < 48:
        return x, p
    x = x * 10 + c - 48

    c = d[p]
    p += 1
    if c < 48:
        return x, p
    x = x * 10 + c - 48

    c = d[p]
    p += 1
    if c < 48:
        return x, p
    x = x * 10 + c - 48

    c = d[p]
    p += 1
    if c < 48:
        return x, p
    x = x * 10 + c - 48

    c = d[p]
    p += 1
    if c < 48:
        return x, p
    x = x * 10 + c - 48

    c = d[p]
    p += 1
    if c < 48:
        return x, p
    x = x * 10 + c - 48

    c = d[p]
    p += 1
    if c < 48:
        return x, p

    # 10桁目
    x = x * 10 + c - 48

    # 次は必ず区切り
    p += 1

    return x, p


def main():
    data = sys.stdin.buffer.read()
    p = 0

    # H
    H = 0
    while True:
        c = data[p]
        p += 1
        if c < 48:
            break
        H = H * 10 + c - 48

    # W
    W = 0
    while True:
        c = data[p]
        p += 1
        if c < 48:
            break
        W = W * 10 + c - 48

    # 最後に改行がない場合のみ sentinel
    if data[-1] >= 48:
        data += b'\n'

    rn = read_num

    # --------------------------------------------------
    # H == 1
    #
    # 最も横長なケース。
    # S1 = T なので答えは 2*T mod 2^32。
    # S 配列も行管理も完全に不要。
    # --------------------------------------------------
    if H == 1:
        total = 0
        j = 0

        while j < W:
            x, p = rn(data, p)
            total += x
            j += 1

        sys.stdout.write(str((total << 1) & MASK))
        return

    S = [0] * H
    total = 0
    r = 0

    # --------------------------------------------------
    # W == 1
    # --------------------------------------------------
    if W == 1:
        while r < H:
            x, p = rn(data, p)

            S[r] = x
            total += x
            r += 1

    # --------------------------------------------------
    # W == 2
    #
    # inner loop を完全に除去
    # --------------------------------------------------
    elif W == 2:
        while r < H:
            a, p = rn(data, p)
            b, p = rn(data, p)

            row = a + b
            S[r] = row
            total += row
            r += 1

    # --------------------------------------------------
    # W == 3
    # --------------------------------------------------
    elif W == 3:
        while r < H:
            a, p = rn(data, p)
            b, p = rn(data, p)
            c, p = rn(data, p)

            row = a + b + c
            S[r] = row
            total += row
            r += 1

    # --------------------------------------------------
    # W == 4
    # --------------------------------------------------
    elif W == 4:
        while r < H:
            a, p = rn(data, p)
            b, p = rn(data, p)
            c, p = rn(data, p)
            d, p = rn(data, p)

            row = a + b + c + d
            S[r] = row
            total += row
            r += 1

    # --------------------------------------------------
    # 一般ケース
    # --------------------------------------------------
    else:
        while r < H:
            row = 0
            j = 0

            while j < W:
                x, p = rn(data, p)
                row += x
                j += 1

            S[r] = row
            total += row
            r += 1

    T = total & MASK

    # ここは現在最速の方式から変更しない
    out = builders.StringBuilder(H * 4)
    append = out.append

    for s in S:
        append(str((s + T) & MASK))
        append('\n')

    sys.stdout.write(out.build())


main()
0