N, M = map(int, input().split()) A = [int(x) for x in input().split()] mod = 1234567891 S = sum(A) # dp[j]: (M % 2**x) + j * 2**x 円払う方法の数 dp = [1] for x in range(60): # 各硬貨を、2**x 枚 使うか使わないか選ぶ for i in range(N): ndp = [0] * (S * 2 + 1) for m in range(len(dp)): if dp[m] > 0: ndp[m + A[i]] = (ndp[m + A[i]] + dp[m]) % mod ndp[m] = (ndp[m] + dp[m]) % mod dp = ndp # 2**(x + 1)で割ったあまりがMと一致しないものは不要 # → j の偶奇が M の第 x ビットと一致するものだけ残し、j を (j - bit) // 2 に詰め直す if (M >> x) & 1 == 0: dp = dp[::2] else: dp = dp[1::2] print(dp[0])