結果

問題 No.1618 Convolution?
ユーザー 草苺奶昔草苺奶昔
提出日時 2023-03-14 15:17:29
言語 Python3
(3.12.2 + numpy 1.26.4 + scipy 1.12.0)
結果
AC  
実行時間 1,517 ms / 2,000 ms
コード長 1,540 bytes
コンパイル時間 170 ms
コンパイル使用メモリ 12,148 KB
実行使用メモリ 157,616 KB
最終ジャッジ日時 2023-10-18 11:42:34
合計ジャッジ時間 25,881 ms
ジャッジサーバーID
(参考情報)
judge13 / judge11
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 485 ms
42,492 KB
testcase_01 AC 479 ms
42,580 KB
testcase_02 AC 1,352 ms
128,184 KB
testcase_03 AC 1,384 ms
150,696 KB
testcase_04 AC 1,048 ms
112,836 KB
testcase_05 AC 504 ms
42,908 KB
testcase_06 AC 1,351 ms
138,124 KB
testcase_07 AC 1,347 ms
138,588 KB
testcase_08 AC 1,038 ms
113,508 KB
testcase_09 AC 1,448 ms
156,644 KB
testcase_10 AC 1,285 ms
120,644 KB
testcase_11 AC 1,437 ms
150,160 KB
testcase_12 AC 1,475 ms
157,616 KB
testcase_13 AC 1,450 ms
157,444 KB
testcase_14 AC 1,484 ms
157,396 KB
testcase_15 AC 1,517 ms
157,184 KB
testcase_16 AC 1,475 ms
157,412 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

from typing import List
import numpy as np


import numpy as np


def _convolution(A, B):
    n, m = len(A), len(B)
    ph = 1 << (n + m - 2).bit_length()
    T = np.fft.rfft(A, ph) * np.fft.rfft(B, ph)
    res = np.fft.irfft(T, ph)[: n + m - 1]
    return np.rint(res).astype(np.int64)


def convolution(A: List[int], B: List[int], mod: int, s=10) -> List[int]:
    A_, B_ = np.array(A, dtype=np.int64), np.array(B, dtype=np.int64)
    s2 = s << 1
    mask = (1 << s) - 1

    m0, m1, m2 = A_ & mask, (A_ >> s) & mask, A_ >> s2
    n0, n1, n2 = B_ & mask, (B_ >> s) & mask, B_ >> s2

    p_0 = m0 + m2
    p0 = m0
    p1 = p_0 + m1
    pm1 = p_0 - m1
    pm2 = ((pm1 + m2) << 1) - m0
    pinf = m2

    q_0 = n0 + n2
    q0 = n0
    q1 = q_0 + n1
    qm1 = q_0 - n1
    qm2 = ((qm1 + n2) << 1) - n0
    qinf = n2

    r0 = _convolution(p0, q0)
    r1 = _convolution(p1, q1)
    rm1 = _convolution(pm1, qm1)
    rm2 = _convolution(pm2, qm2)
    rinf = _convolution(pinf, qinf)

    r_0 = r0
    r_4 = rinf
    r_3 = (rm2 - r1) // 3
    r_1 = (r1 - rm1) >> 1
    r_2 = rm1 - r0
    r_3 = ((r_2 - r_3) >> 1) + (rinf << 1)
    r_2 += r_1 - r_4
    r_1 -= r_3

    res = ((r_4 << s2) + (r_3 << s) + r_2) % mod
    res = ((res << s2) + (r_1 << s) + r_0) % mod
    return list(res)


n = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))

MOD = int(1e18)
A = [0] + A
B = [0] + B
f = list(range(n + 1))
A = convolution(A, f, MOD)
B = convolution(B, f, MOD)
C = [a + b for a, b in zip(A, B)]
C = C[1:]
print(*C)
0