#include using namespace std; #include //using namespace atcoder; using ll = long long; using ull = unsigned long long; using i128 = __int128_t; using u128 = unsigned __int128_t; using mint = atcoder::static_modint<998244353>; const int mod = 1234567891; #include mt19937_64 rng(std::chrono::steady_clock::now().time_since_epoch().count()); int dx[8] = {-1, 1, 0, 0, -1, -1, 1, 1}; int dy[8] = {0, 0, -1, 1, -1, 1, -1, 1}; template bool chmin(T& a, const T& b){ if (b < a){ a = b; return true; } else { return false; } } template bool chmax(T& a, const T& b){ if (a < b){ a = b; return true; } else { return false; } } template vector convolution(vector a, vector b){ vector vec((int)a.size() + (int)b.size()); for (int i = 0; i < (int)a.size(); i++){ for (int j = 0; j < (int)b.size(); j++){ vec[i + j] += a[i] * b[j]; vec[i + j] += mod; vec[i + j] %= mod; } } return vec; } //P(x) / Q(x)のn項の係数を求める template T Bostan_Mori(ll n, vector x, vector y){ while(n){ vector yy = y; for (int i = 1; i < (int)y.size(); i += 2){ yy[i] = -y[i]; } vector xx = convolution(x, yy); yy = convolution(y, yy); for (int i = 0; i < (int)y.size(); i++){ y[i] = yy[i * 2]; } vector z(((int)xx.size() + 1 - (n & 1)) / 2); if (n & 1){ for (int i = 1; i < (int)xx.size(); i += 2){ z[i / 2] = xx[i]; } } else { for (int i = 0; i < (int)xx.size(); i += 2){ z[i / 2] = xx[i]; } } x = z; n >>= 1; } return x[0] / y[0]; } // ak = x0 * ak - 1 + ... + xk - 1 * a0となるk項間漸化式のn項目を求める template T Linear_Recurrence(ll n, vector x, vector a){ int k = (int)x.size(); if (n < (int)a.size()){ return a[n]; } vector q(k + 1); q[0] = T(1); for (int i = 0; i < k; i++){ q[i + 1] = -x[i]; } auto p = atcoder::convolution(q, a); p.resize(k); return Bostan_Mori(n, p, q); } void solve(){ ll n, m; cin >> n >> m; vector x = {1}; for (int i = 0; i < n; i++){ ll a; cin >> a; vector t(a + 1); t[0] = 1; t[a] = -1; x = convolution(x, t); } vector now = {1}; cout << Bostan_Mori(m, now, x) << '\n'; }; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int t = 1; while(t--){ cout << fixed << setprecision(15); solve(); } }