## https://yukicoder.me/problems/no/353 import math MOD = 998244353 def main(): N, K = map(int, input().split()) A = list(map(int, input().split())) if K == 1: return (pow(2, N, MOD) - 1) % MOD # Kを素因数分解 sqrt_k = int(math.sqrt(K)) k_primes = {} for p in range(2, sqrt_k + 1): if K % p == 0: ans = 0 while K % p == 0: ans += 1 K //= p k_primes[p] = ans if K > 1: k_primes[K] = 1 k_primes_array = [(p, value) for p, value in k_primes.items()] k_primes_array.sort(key=lambda x: x[0]) # 各要素について a_array = [] for a in A: ans = [] for p, value in k_primes_array: x = 0 while a % p == 0: x += 1 a //= p ans.append(x) a_array.append(tuple(ans)) # dpで解く dp = {tuple([0] * len(k_primes_array)): 1} for a in a_array: new_dp = dp.copy() for key, value in dp.items(): new_key = list(key) for j in range(len(k_primes_array)): max_v = k_primes_array[j][1] new_key[j] = min(max_v, key[j] + a[j]) new_key = tuple(new_key) if new_key not in new_dp: new_dp[new_key] = 0 new_dp[new_key] += value new_dp[new_key] %= MOD dp = new_dp max_ = tuple([value for _, value in k_primes_array]) if max_ not in dp: print(0) else: print(dp[max_]) if __name__ == "__main__": main()