MOD = 998244353 ROOT = 3 def ntt(a, invert=False): n = len(a) j = 0 for i in range(1, n-1): bit = n >> 1 while j >= bit: j -= bit bit >>= 1 j += bit if i < j: a[i], a[j] = a[j], a[i] log_n = (n).bit_length() - 1 root = 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 % MOD for L in range(2, n + 1, 2): L_half = L // 2 step = n // L for i in range(0, n, L): for j in range(L_half): idx_e = i + j idx_o = i + j + L_half even = a[idx_e] odd = a[idx_o] * roots[j * step] % MOD a[idx_e] = (even + odd) % MOD a[idx_o] = (even - odd) % MOD if a[idx_o] < 0: a[idx_o] += MOD if invert: inv_n = pow(n, MOD-2, MOD) for i in range(n): a[i] = a[i] * inv_n % MOD return a def 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 - 1 n = 1 while n < max_len: n <<= 1 a_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) // 2 left = compute_polynomial(d_list[:mid]) right = compute_polynomial(d_list[mid:]) return multiply_ntt(left, right) def main(): import sys input = sys.stdin.read().split() ptr = 0 N = int(input[ptr]) ptr += 1 Q = int(input[ptr]) ptr += 1 A = list(map(int, input[ptr:ptr+N])) ptr += N B_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 - B if 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()