/** * author: zjs * created: 08.05.2026 16:52:47 **/ #include using namespace std; #ifdef LOCAL #include "debug.h" #else #define debug(...) 42 #endif int main() { ios::sync_with_stdio(0); cin.tie(0); int n; unsigned long long m; cin >> n >> m; vector a(n); for (int i = 0; i < n; i++) cin >> a[i]; const int mod = 1234567891; int s = accumulate(a.begin(), a.end(), 0); vector f(s + 1); //背包 f[i][j]:a[1] ..., a[i] 中选一些,所选的数之和等于 j,有多少种选法 f[0] = 1; for (int x : a) for (int i = s; i >= x; i--) f[i] = (f[i] + f[i - x]) % mod; vector carry(s); carry[0] = 1; int len = bit_width(m); for (int b = 0; b < len; b++) { int bit = m >> b & 1; vector n_carry(s); for (int i = 0; i < s; i++) for (int j = 0; j <= s; j++) { if (((i + j) & 1) == bit) { n_carry[(i + j) >> 1] += carry[i] * f[j] % mod; } } for (int i = 0; i < s; i++) n_carry[i] %= mod; carry = n_carry; } cout << carry[0] << '\n'; }