結果
問題 | 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 |
ソースコード
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)