結果

問題 No.206 数の積集合を求めるクエリ
ユーザー neterukunneterukun
提出日時 2021-05-03 10:44:16
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 584 ms / 7,000 ms
コード長 1,531 bytes
コンパイル時間 278 ms
コンパイル使用メモリ 87,004 KB
実行使用メモリ 233,044 KB
最終ジャッジ日時 2023-09-29 05:09:27
合計ジャッジ時間 12,994 ms
ジャッジサーバーID
(参考情報)
judge12 / judge11
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 77 ms
71,948 KB
testcase_01 AC 76 ms
71,572 KB
testcase_02 AC 86 ms
77,160 KB
testcase_03 AC 71 ms
71,772 KB
testcase_04 AC 72 ms
71,740 KB
testcase_05 AC 80 ms
76,196 KB
testcase_06 AC 104 ms
78,580 KB
testcase_07 AC 106 ms
78,880 KB
testcase_08 AC 107 ms
78,932 KB
testcase_09 AC 107 ms
78,920 KB
testcase_10 AC 77 ms
71,744 KB
testcase_11 AC 92 ms
76,928 KB
testcase_12 AC 117 ms
79,152 KB
testcase_13 AC 113 ms
78,928 KB
testcase_14 AC 115 ms
78,996 KB
testcase_15 AC 114 ms
78,920 KB
testcase_16 AC 112 ms
78,812 KB
testcase_17 AC 544 ms
225,448 KB
testcase_18 AC 546 ms
226,276 KB
testcase_19 AC 549 ms
225,812 KB
testcase_20 AC 520 ms
225,848 KB
testcase_21 AC 553 ms
226,112 KB
testcase_22 AC 529 ms
226,612 KB
testcase_23 AC 532 ms
225,980 KB
testcase_24 AC 558 ms
231,808 KB
testcase_25 AC 584 ms
232,504 KB
testcase_26 AC 543 ms
232,884 KB
testcase_27 AC 566 ms
232,492 KB
testcase_28 AC 546 ms
233,044 KB
testcase_29 AC 550 ms
232,768 KB
testcase_30 AC 546 ms
233,004 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys
input = sys.stdin.buffer.readline
from cmath import pi, exp


def _fft(a, h):
    roots = [exp(2.0j * pi / 2 ** i) for i in range(h + 1)]
    for i in range(h):
        m = 1 << (h - i - 1)
        for j in range(1 << i):
            w = 1
            j *= 2 * m
            for k in range(m):
                a[j + k], a[j + k + m] = \
                    a[j + k] + a[j + k + m], (a[j + k] - a[j + k + m]) * w
                w *= roots[h - i]


def _ifft(a, h):
    iroots = [exp(-2.0j * pi / 2 ** i) for i in range(h + 1)]
    for i in range(h):
        m = 1 << i
        for j in range(1 << (h - i - 1)):
            w = 1
            j *= 2 * m
            for k in range(m):
                a[j + k], a[j + k + m] = \
                    a[j + k] + a[j + k + m] * w, a[j + k] - a[j + k + m] * w
                w *= iroots[i + 1]
    n = 1 << h
    for i in range(n):
        a[i] /= n


def fft_convolve(a, b):
    n = 1 << (len(a) + len(b) - 1).bit_length()
    h = n.bit_length() - 1
    a = list(a) + [0] * (n - len(a))
    b = list(b) + [0] * (n - len(b))

    _fft(a, h), _fft(b, h)
    a = [va * vb for va, vb in zip(a, b)]
    _ifft(a, h)
    return [int(abs(val) + 0.5) for val in a]


l, m, n = map(int, input().split())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
q = int(input())


cnta = [0] * (n + 1)
cntb = [0] * (n + 1)
for val in a:
    cnta[val] += 1
for val in b:
    cntb[n - val] += 1

conv = fft_convolve(cnta, cntb)

for i in range(n, n + q):
    print(conv[i])
0