結果

問題 No.1618 Convolution?
ユーザー 草苺奶昔草苺奶昔
提出日時 2023-03-14 15:17:29
言語 Python3
(3.12.2 + numpy 1.26.4 + scipy 1.12.0)
結果
AC  
実行時間 1,688 ms / 2,000 ms
コード長 1,540 bytes
コンパイル時間 329 ms
コンパイル使用メモリ 13,056 KB
実行使用メモリ 162,448 KB
最終ジャッジ日時 2024-09-18 08:05:53
合計ジャッジ時間 28,094 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 532 ms
44,024 KB
testcase_01 AC 520 ms
44,544 KB
testcase_02 AC 1,527 ms
130,204 KB
testcase_03 AC 1,551 ms
153,692 KB
testcase_04 AC 1,176 ms
114,180 KB
testcase_05 AC 573 ms
45,980 KB
testcase_06 AC 1,574 ms
142,592 KB
testcase_07 AC 1,585 ms
144,664 KB
testcase_08 AC 1,195 ms
115,352 KB
testcase_09 AC 1,682 ms
161,556 KB
testcase_10 AC 1,481 ms
122,676 KB
testcase_11 AC 1,645 ms
156,648 KB
testcase_12 AC 1,652 ms
162,448 KB
testcase_13 AC 1,688 ms
161,952 KB
testcase_14 AC 1,685 ms
162,340 KB
testcase_15 AC 1,651 ms
161,756 KB
testcase_16 AC 1,655 ms
162,288 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