結果
問題 | No.1068 #いろいろな色 / Red and Blue and more various colors (Hard) |
ユーザー |
![]() |
提出日時 | 2025-03-26 15:46:24 |
言語 | PyPy3 (7.3.15) |
結果 |
RE
|
実行時間 | - |
コード長 | 2,537 bytes |
コンパイル時間 | 257 ms |
コンパイル使用メモリ | 82,280 KB |
実行使用メモリ | 146,288 KB |
最終ジャッジ日時 | 2025-03-26 15:46:49 |
合計ジャッジ時間 | 6,452 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 1 RE * 28 |
ソースコード
MOD = 998244353ROOT = 3def ntt(a, invert=False):n = len(a)j = 0for i in range(1, n-1):bit = n >> 1while j >= bit:j -= bitbit >>= 1j += bitif i < j:a[i], a[j] = a[j], a[i]log_n = (n).bit_length() - 1root = pow(ROOT, (MOD - 1) // n, MOD) if not invert else pow(ROOT, (MOD - 1) - (MOD - 1) // n, MOD)roots = [1] * (n // 2)for i in range(1, n // 2):roots[i] = roots[i-1] * root % MODfor L in range(2, n + 1, 2):L_half = L // 2step = n // Lfor i in range(0, n, L):for j in range(L_half):idx_e = i + jidx_o = i + j + L_halfeven = a[idx_e]odd = a[idx_o] * roots[j * step] % MODa[idx_e] = (even + odd) % MODa[idx_o] = (even - odd) % MODif a[idx_o] < 0:a[idx_o] += MODif invert:inv_n = pow(n, MOD-2, MOD)for i in range(n):a[i] = a[i] * inv_n % MODreturn adef multiply_ntt(a, b):len_a = len(a)len_b = len(b)if len_a == 0 or len_b == 0:return []max_len = len_a + len_b - 1n = 1while n < max_len:n <<= 1a_ntt = a + [0] * (n - len_a)b_ntt = b + [0] * (n - len_b)a_ntt = ntt(a_ntt)b_ntt = ntt(b_ntt)c_ntt = [(x * y) % MOD for x, y in zip(a_ntt, b_ntt)]c = ntt(c_ntt, invert=True)return c[:max_len]def compute_polynomial(d_list):if len(d_list) == 0:return [1]if len(d_list) == 1:return [1, d_list[0]]mid = len(d_list) // 2left = compute_polynomial(d_list[:mid])right = compute_polynomial(d_list[mid:])return multiply_ntt(left, right)def main():import sysinput = sys.stdin.read().split()ptr = 0N = int(input[ptr])ptr += 1Q = int(input[ptr])ptr += 1A = list(map(int, input[ptr:ptr+N]))ptr += NB_list = list(map(int, input[ptr:ptr+Q]))d_list = [(a - 1) % MOD for a in A]non_zero = [d for d in d_list if d != 0]M = len(non_zero)if M == 0:product_coeffs = [1]else:product_coeffs = compute_polynomial(non_zero)for B in B_list:K = N - Bif K < 0 or K > M:print(0)else:if K < len(product_coeffs):print(product_coeffs[K] % MOD)else:print(0)if __name__ == "__main__":main()