#include #define rep(i, a, b) for(int i = (a); i <= (b); i ++) using std::cin, std::cout, std::cerr; using ll = long long; const ll P = 998244353; struct Comb { std::vector inv, fac, ifac; Comb(int n) { Init(n); } void Init(int n) { inv.assign(n + 1, 0); fac.assign(n + 1, 0); ifac.assign(n + 1, 0); fac[0] = ifac[0] = 1; for(int i = 1; i <= n; i ++) { inv[i] = i == 1 ? 1 : (P - P / i) * inv[P % i] % P; fac[i] = fac[i - 1] * i % P; ifac[i] = ifac[i - 1] * inv[i] % P; } } ll Binom(int n, int m) { if(m < 0 || n < m) return 0; return fac[n] * ifac[m] % P * ifac[n - m] % P; } }comb(1e6 + 1); int main() { std::ios::sync_with_stdio(false); int n, m; cin >> n >> m; std::vector f(m + 1, -1); f[0] = 0; auto upd = [](int &a, int b) { if(a == -1 || a > b) a = b; }; while(n --) { int a; cin >> a; rep(i, 0, m) if(f[i] != -1 && i + a <= m) upd(f[i + a], f[i] + 1); } ll ans = 0; rep(i, 0, m) if(f[i] != -1) { ans += comb.Binom(m - f[i], i - f[i]); ans %= P; } cout << ans << '\n'; }