結果
| 問題 |
No.206 数の積集合を求めるクエリ
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-08-28 12:05:17 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 2,001 ms / 7,000 ms |
| コード長 | 1,560 bytes |
| コンパイル時間 | 122 ms |
| コンパイル使用メモリ | 12,544 KB |
| 実行使用メモリ | 148,944 KB |
| 最終ジャッジ日時 | 2024-11-21 20:53:33 |
| 合計ジャッジ時間 | 63,232 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 28 |
ソースコード
import sys
import numpy as np
def read_int(): return int(input())
def read_int_tuple(): return map(int, sys.stdin.readline().rstrip().split())
def read_int_list(): return list(map(int, input().split()))
def convolute(As, Bs, MOD=10 ** 9 + 7, fft_len=2 ** 20):
""" As, Bs, np.array([..], dtype=np.int64) """
def _convolute8(aa, bb):
return np.round(np.real(np.fft.irfft(np.fft.rfft(aa, fft_len) *
np.fft.rfft(bb, fft_len),
fft_len))).astype(np.int64)
def _convolute16(aa, bb):
mask = (1 << 8) - 1
uAs = aa >> 8
uBs = bb >> 8
dAs = aa & mask
dBs = bb & mask
uCs = _convolute8(uAs, uBs) % MOD
dCs = _convolute8(dAs, dBs) % MOD
mCs = (_convolute8((uAs + dAs), (uBs + dBs)) - uCs - dCs) % MOD
return (uCs * pow(2, 8 * 2, MOD) + mCs * pow(2, 8, MOD) + dCs) % MOD
mask = (1 << 16) - 1
uAs = As >> 16
uBs = Bs >> 16
dAs = As & mask
dBs = Bs & mask
uCs = _convolute16(uAs, uBs) % MOD
dCs = _convolute16(dAs, dBs) % MOD
mCs = (_convolute16((uAs + dAs), (uBs + dBs)) - uCs - dCs) % MOD
return (uCs * pow(2, 16 * 2, MOD) + mCs * pow(2, 16, MOD) + dCs) % MOD
L, M, N = read_int_tuple()
A = read_int_list()
B = read_int_list()
Q = read_int()
C = [0] * (N + 1)
D = [0] * (N + 1)
for a in A:
C[a] = 1
for b in B:
D[N - b] = 1
ans = convolute(np.array(C, dtype=np.int64), np.array(D, dtype=np.int64))
for i in range(Q):
print(ans[N + i])