/*
Author: Nguyen Nhut Truong
From Chuyen Tien Giang High School For The Gifed
*/
#include <bits/stdc++.h>
using namespace std;
//#define int long long
#define start signed main
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define il pair<int,ll>
#define ii pair<int,int>
#define len(s) (int)s.size()
#define all(s) (s).begin(),(s).end()
#define OpenFile(Name) if (fopen(Name".inp","r")) freopen(Name".inp","r",stdin),freopen(Name".out","w",stdout);
#define MASK(x) ((1LL)<<(x))
#define Bit(x,i) (((x)>>(i))&1)
#define Countbit(x) __builtin_popcountll(x)
typedef long long ll;
typedef long double ld;
int dx[]={1,-1,0,0,-1,1,1,-1};
int dy[]={0,0,1,-1,-1,-1,1,1};
template <class C> bool Minimize(C &a, C b) { if (a>b) { a=b; return true; } return false;}
template <class C> bool Maximize(C &a, C b) { if (a<b) { a=b; return true; } return false;}
inline ll add(ll a,ll b,ll c) { return (a+b)%c; };
inline ll suf(ll a,ll b,ll c) { return (a-b+c)%c; };
inline ll mul(ll a,ll b,ll c) { return ((a%c)*(b%c))%c; };
mt19937_64 rd(chrono::steady_clock::now().time_since_epoch().count());
ll rand(ll l,ll r){
assert(l<=r);
return l+rd()%(r-l+1);
}
void MakeInp() {
ofstream cout("Task.inp");
ll n=rand(1,1000),s=rand(1,1000);
cout<<n<<' '<<s<<endl;
for (int i=1;i<=n;++i) {
ll f=rand(0,1e3);
cout<<f<<' ';
}
cout.close();
}
/// Constant Limit
const int N=1e6+5,M=1e3+5,INF=1e9,lim=1e6;
const int block=448,base=31;
ll Mod=998244353,Mod_base=1777777777,LNF=1e18;
///________________________________________________________________________________________________________
int n;
ll a[N],s;
namespace task1 {
void solve() {
ll res=0;
for (int mask=1;mask<MASK(n);++mask) {
ll cur=0;
for (int i=1;i<=n;++i)
if (Bit(mask,i-1)) cur+=a[i];
if (cur==s) res++;
}
cout<<res%Mod;
}
}
namespace task2 {
void solve() {
int res=0;
vector<vector<ll>> dp(n+3,vector<ll>(s+3,0));
dp[0][0]=1;
for (int i=1;i<=n;++i)
for (int j=0;j<=s;++j) {
dp[i][j]=dp[i-1][j];
if (j-a[i]>=0) dp[i][j]=add(dp[i][j],dp[i-1][j-a[i]],Mod);
}
cout<<dp[n][s];
}
}
start() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
OpenFile("TASK");
//MakeInp();
cin>>n>>s;
for (int i=1;i<=n;++i) cin>>a[i];
//task1::solve();
//task2::solve();
if (n<=20) task1::solve(); else task2::solve();
//cerr<<"\nBien dich thanh cong\nTime: "<<(1.0*clock()/CLOCKS_PER_SEC)<<" s\n";
return 0;
}
LyoKICAgIEF1dGhvcjogTmd1eWVuIE5odXQgVHJ1b25nCiAgICBGcm9tIENodXllbiBUaWVuIEdpYW5nIEhpZ2ggU2Nob29sIEZvciBUaGUgR2lmZWQKKi8KI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIHN0YXJ0IHNpZ25lZCBtYWluCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBlYiBlbXBsYWNlX2JhY2sKI2RlZmluZSBpbCBwYWlyPGludCxsbD4KI2RlZmluZSBpaSBwYWlyPGludCxpbnQ+CiNkZWZpbmUgbGVuKHMpIChpbnQpcy5zaXplKCkKI2RlZmluZSBhbGwocykgKHMpLmJlZ2luKCksKHMpLmVuZCgpCiNkZWZpbmUgT3BlbkZpbGUoTmFtZSkgaWYgKGZvcGVuKE5hbWUiLmlucCIsInIiKSkgZnJlb3BlbihOYW1lIi5pbnAiLCJyIixzdGRpbiksZnJlb3BlbihOYW1lIi5vdXQiLCJ3IixzdGRvdXQpOwoKI2RlZmluZSBNQVNLKHgpICgoMUxMKTw8KHgpKQojZGVmaW5lIEJpdCh4LGkpICgoKHgpPj4oaSkpJjEpCiNkZWZpbmUgQ291bnRiaXQoeCkgX19idWlsdGluX3BvcGNvdW50bGwoeCkKCnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIGxvbmcgZG91YmxlIGxkOwoKaW50IGR4W109ezEsLTEsMCwwLC0xLDEsMSwtMX07CmludCBkeVtdPXswLDAsMSwtMSwtMSwtMSwxLDF9OwoKdGVtcGxhdGUgPGNsYXNzIEM+IGJvb2wgTWluaW1pemUoQyAmYSwgQyBiKSB7IGlmIChhPmIpIHsgYT1iOyByZXR1cm4gdHJ1ZTsgfSByZXR1cm4gZmFsc2U7fQp0ZW1wbGF0ZSA8Y2xhc3MgQz4gYm9vbCBNYXhpbWl6ZShDICZhLCBDIGIpIHsgaWYgKGE8YikgeyBhPWI7IHJldHVybiB0cnVlOyB9IHJldHVybiBmYWxzZTt9CgppbmxpbmUgbGwgYWRkKGxsIGEsbGwgYixsbCBjKSB7IHJldHVybiAoYStiKSVjOyB9OwppbmxpbmUgbGwgc3VmKGxsIGEsbGwgYixsbCBjKSB7IHJldHVybiAoYS1iK2MpJWM7IH07CmlubGluZSBsbCBtdWwobGwgYSxsbCBiLGxsIGMpIHsgcmV0dXJuICgoYSVjKSooYiVjKSklYzsgfTsKCm10MTk5MzdfNjQgcmQoY2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKS5jb3VudCgpKTsKCmxsIHJhbmQobGwgbCxsbCByKXsKICAgIGFzc2VydChsPD1yKTsKICAgIHJldHVybiBsK3JkKCklKHItbCsxKTsKfQoKdm9pZCBNYWtlSW5wKCkgewogICAgb2ZzdHJlYW0gY291dCgiVGFzay5pbnAiKTsKCiAgICBsbCBuPXJhbmQoMSwxMDAwKSxzPXJhbmQoMSwxMDAwKTsKICAgIGNvdXQ8PG48PCcgJzw8czw8ZW5kbDsKICAgIGZvciAoaW50IGk9MTtpPD1uOysraSkgewogICAgICAgIGxsIGY9cmFuZCgwLDFlMyk7CiAgICAgICAgY291dDw8Zjw8JyAnOwogICAgfQoKCiAgICBjb3V0LmNsb3NlKCk7Cn0KCi8vLyBDb25zdGFudCBMaW1pdAoKY29uc3QgaW50IE49MWU2KzUsTT0xZTMrNSxJTkY9MWU5LGxpbT0xZTY7CmNvbnN0IGludCBibG9jaz00NDgsYmFzZT0zMTsKCmxsIE1vZD05OTgyNDQzNTMsTW9kX2Jhc2U9MTc3Nzc3Nzc3NyxMTkY9MWUxODsKCi8vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgppbnQgbjsKbGwgYVtOXSxzOwoKbmFtZXNwYWNlIHRhc2sxIHsKICAgIHZvaWQgc29sdmUoKSB7CiAgICAgICAgbGwgcmVzPTA7CiAgICAgICAgZm9yIChpbnQgbWFzaz0xO21hc2s8TUFTSyhuKTsrK21hc2spIHsKICAgICAgICAgICAgbGwgY3VyPTA7CiAgICAgICAgICAgIGZvciAoaW50IGk9MTtpPD1uOysraSkKICAgICAgICAgICAgaWYgKEJpdChtYXNrLGktMSkpIGN1cis9YVtpXTsKCiAgICAgICAgICAgIGlmIChjdXI9PXMpIHJlcysrOwogICAgICAgIH0KCiAgICAgICAgY291dDw8cmVzJU1vZDsKICAgIH0KfQoKbmFtZXNwYWNlIHRhc2syIHsKICAgIHZvaWQgc29sdmUoKSB7CiAgICAgICAgaW50IHJlcz0wOwogICAgICAgIHZlY3Rvcjx2ZWN0b3I8bGw+PiBkcChuKzMsdmVjdG9yPGxsPihzKzMsMCkpOwoKICAgICAgICBkcFswXVswXT0xOwogICAgICAgIGZvciAoaW50IGk9MTtpPD1uOysraSkKICAgICAgICBmb3IgKGludCBqPTA7ajw9czsrK2opIHsKICAgICAgICAgICAgZHBbaV1bal09ZHBbaS0xXVtqXTsKICAgICAgICAgICAgaWYgKGotYVtpXT49MCkgZHBbaV1bal09YWRkKGRwW2ldW2pdLGRwW2ktMV1bai1hW2ldXSxNb2QpOwogICAgICAgIH0KCiAgICAgICAgY291dDw8ZHBbbl1bc107CiAgICB9Cn0KCnN0YXJ0KCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IGNpbi50aWUoMCk7IGNvdXQudGllKDApOwogICAgT3BlbkZpbGUoIlRBU0siKTsKCiAgICAvL01ha2VJbnAoKTsKICAgIGNpbj4+bj4+czsKICAgIGZvciAoaW50IGk9MTtpPD1uOysraSkgY2luPj5hW2ldOwoKICAgIC8vdGFzazE6OnNvbHZlKCk7CiAgICAvL3Rhc2syOjpzb2x2ZSgpOwogICAgaWYgKG48PTIwKSB0YXNrMTo6c29sdmUoKTsgZWxzZSB0YXNrMjo6c29sdmUoKTsKCgoKCgoKICAgIC8vY2Vycjw8IlxuQmllbiBkaWNoIHRoYW5oIGNvbmdcblRpbWU6ICI8PCgxLjAqY2xvY2soKS9DTE9DS1NfUEVSX1NFQyk8PCIgc1xuIjsKICAgIHJldHVybiAwOwp9Cg==