結果

問題 No.3677 Global Checksum
コンテスト
ユーザー harurun
提出日時 2026-08-11 05:00:04
言語 PyPy3
(7.3.23)
コンパイル:
pypy3 -mpy_compile _filename_
実行:
pypy3 _filename_
結果
TLE  
実行時間 -
コード長 6,840 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 257 ms
コンパイル使用メモリ 96,352 KB
実行使用メモリ 173,824 KB
最終ジャッジ日時 2026-09-04 22:20:27
合計ジャッジ時間 8,913 ms
ジャッジサーバーID
(参考情報)
judge2_1 / judge1_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 11 TLE * 9
権限があれば一括ダウンロードができます

ソースコード

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


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

    x = x * 10 + c - 48

    # 10桁なので次は必ず区切り
    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

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

    rn = read_num

    # ------------------------------------------------------------
    # H == 1
    #
    # S1 = T なので C1 = 2*T mod 2^32
    # 8個ずつ処理してループ制御を削減
    # ------------------------------------------------------------
    if H == 1:
        total = 0

        q = W >> 3
        while q:
            a, p = rn(data, p)
            b, p = rn(data, p)
            c, p = rn(data, p)
            d, p = rn(data, p)
            e, p = rn(data, p)
            f, p = rn(data, p)
            g, p = rn(data, p)
            h, p = rn(data, p)

            total += a + b + c + d + e + f + g + h
            q -= 1

        rem = W & 7

        if rem:
            a, p = rn(data, p)
            total += a

            if rem > 1:
                a, p = rn(data, p)
                total += a

                if rem > 2:
                    a, p = rn(data, p)
                    total += a

                    if rem > 3:
                        a, p = rn(data, p)
                        total += a

                        if rem > 4:
                            a, p = rn(data, p)
                            total += a

                            if rem > 5:
                                a, p = rn(data, p)
                                total += a

                                if rem > 6:
                                    a, p = rn(data, p)
                                    total += a

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

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

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

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

    # ------------------------------------------------------------
    # W == 2
    # ------------------------------------------------------------
    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

    # ------------------------------------------------------------
    # W >= 5
    #
    # 8要素ずつ処理する
    # ------------------------------------------------------------
    else:
        blocks = W >> 3
        rem = W & 7

        while r < H:
            row = 0

            q = blocks

            while q:
                a, p = rn(data, p)
                b, p = rn(data, p)
                c, p = rn(data, p)
                d, p = rn(data, p)
                e, p = rn(data, p)
                f, p = rn(data, p)
                g, p = rn(data, p)
                h, p = rn(data, p)

                row += a + b + c + d + e + f + g + h
                q -= 1

            # 最大7個。ループを作らず直線化する。
            if rem:
                a, p = rn(data, p)
                row += a

                if rem > 1:
                    a, p = rn(data, p)
                    row += a

                    if rem > 2:
                        a, p = rn(data, p)
                        row += a

                        if rem > 3:
                            a, p = rn(data, p)
                            row += a

                            if rem > 4:
                                a, p = rn(data, p)
                                row += a

                                if rem > 5:
                                    a, p = rn(data, p)
                                    row += a

                                    if rem > 6:
                                        a, p = rn(data, p)
                                        row += a

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

    T = total & MASK

    # PyPy の StringBuilder を維持
    out = builders.StringBuilder(H * 4)
    append = out.append

    # ------------------------------------------------------------
    # 出力も4要素ずつアンロール
    # ------------------------------------------------------------
    i = 0
    n = H & ~3

    while i < n:
        append(str((S[i] + T) & MASK))
        append('\n')

        append(str((S[i + 1] + T) & MASK))
        append('\n')

        append(str((S[i + 2] + T) & MASK))
        append('\n')

        append(str((S[i + 3] + T) & MASK))
        append('\n')

        i += 4

    while i < H:
        append(str((S[i] + T) & MASK))
        append('\n')
        i += 1

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


main()
0