/*
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 s;
vector<ll> a;
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];
}
}
namespace task3 {
vector<int> res1,res2;
void Try1(int i,ll sum) {
if (sum>s) return;
if (i==n/2+1) res1.pb(sum);
else {
Try1(i+1,sum+a[i]);
Try1(i+1,sum);
}
}
void Try2(int i,ll sum) {
if (sum>s) return;
if (i==n+1) res2.pb(sum);
else {
Try2(i+1,sum+a[i]);
Try2(i+1,sum);
}
}
void solve() {
ll ans=0;
Try1(1,0);
Try2(n/2+1,0);
sort(all(res1));
for(ll x:res2) {
int tmp1=upper_bound(all(res1),s-x)-res1.begin();
int tmp2=lower_bound(all(res1),s-x)-res1.begin();
ans=add(ans,tmp1-tmp2,Mod);
//ans+=tmp1-tmp2;
}
cout<<ans;
}
}
start() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
OpenFile("TASK");
//MakeInp();
cin>>n>>s;
a.eb(0);
for (int i=1;i<=n;++i) {
ll x; cin>>x;
a.eb(x);
}
//task1::solve();
//task2::solve();
//task3::solve();
if (n<=20) task1::solve(); else
if (n<=40) task2::solve(); else task3::solve();
//cerr<<"\nBien dich thanh cong\nTime: "<<(1.0*clock()/CLOCKS_PER_SEC)<<" s\n";
return 0;
}
LyoKICAgIEF1dGhvcjogTmd1eWVuIE5odXQgVHJ1b25nCiAgICBGcm9tIENodXllbiBUaWVuIEdpYW5nIEhpZ2ggU2Nob29sIEZvciBUaGUgR2lmZWQKKi8KI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIHN0YXJ0IHNpZ25lZCBtYWluCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBlYiBlbXBsYWNlX2JhY2sKI2RlZmluZSBpbCBwYWlyPGludCxsbD4KI2RlZmluZSBpaSBwYWlyPGludCxpbnQ+CiNkZWZpbmUgbGVuKHMpIChpbnQpcy5zaXplKCkKI2RlZmluZSBhbGwocykgKHMpLmJlZ2luKCksKHMpLmVuZCgpCiNkZWZpbmUgT3BlbkZpbGUoTmFtZSkgaWYgKGZvcGVuKE5hbWUiLmlucCIsInIiKSkgZnJlb3BlbihOYW1lIi5pbnAiLCJyIixzdGRpbiksZnJlb3BlbihOYW1lIi5vdXQiLCJ3IixzdGRvdXQpOwoKI2RlZmluZSBNQVNLKHgpICgoMUxMKTw8KHgpKQojZGVmaW5lIEJpdCh4LGkpICgoKHgpPj4oaSkpJjEpCiNkZWZpbmUgQ291bnRiaXQoeCkgX19idWlsdGluX3BvcGNvdW50bGwoeCkKCnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIGxvbmcgZG91YmxlIGxkOwoKaW50IGR4W109ezEsLTEsMCwwLC0xLDEsMSwtMX07CmludCBkeVtdPXswLDAsMSwtMSwtMSwtMSwxLDF9OwoKdGVtcGxhdGUgPGNsYXNzIEM+IGJvb2wgTWluaW1pemUoQyAmYSwgQyBiKSB7IGlmIChhPmIpIHsgYT1iOyByZXR1cm4gdHJ1ZTsgfSByZXR1cm4gZmFsc2U7fQp0ZW1wbGF0ZSA8Y2xhc3MgQz4gYm9vbCBNYXhpbWl6ZShDICZhLCBDIGIpIHsgaWYgKGE8YikgeyBhPWI7IHJldHVybiB0cnVlOyB9IHJldHVybiBmYWxzZTt9CgppbmxpbmUgbGwgYWRkKGxsIGEsbGwgYixsbCBjKSB7IHJldHVybiAoYStiKSVjOyB9OwppbmxpbmUgbGwgc3VmKGxsIGEsbGwgYixsbCBjKSB7IHJldHVybiAoYS1iK2MpJWM7IH07CmlubGluZSBsbCBtdWwobGwgYSxsbCBiLGxsIGMpIHsgcmV0dXJuICgoYSVjKSooYiVjKSklYzsgfTsKCm10MTk5MzdfNjQgcmQoY2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKS5jb3VudCgpKTsKCmxsIHJhbmQobGwgbCxsbCByKXsKICAgIGFzc2VydChsPD1yKTsKICAgIHJldHVybiBsK3JkKCklKHItbCsxKTsKfQoKdm9pZCBNYWtlSW5wKCkgewogICAgb2ZzdHJlYW0gY291dCgiVGFzay5pbnAiKTsKCiAgICBsbCBuPXJhbmQoMSwxMDAwKSxzPXJhbmQoMSwxMDAwKTsKICAgIGNvdXQ8PG48PCcgJzw8czw8ZW5kbDsKICAgIGZvciAoaW50IGk9MTtpPD1uOysraSkgewogICAgICAgIGxsIGY9cmFuZCgwLDFlMyk7CiAgICAgICAgY291dDw8Zjw8JyAnOwogICAgfQoKCiAgICBjb3V0LmNsb3NlKCk7Cn0KCi8vLyBDb25zdGFudCBMaW1pdAoKY29uc3QgaW50IE49MWU2KzUsTT0xZTMrNSxJTkY9MWU5LGxpbT0xZTY7CmNvbnN0IGludCBibG9jaz00NDgsYmFzZT0zMTsKCmxsIE1vZD05OTgyNDQzNTMsTW9kX2Jhc2U9MTc3Nzc3Nzc3NyxMTkY9MWUxODsKCi8vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgppbnQgbjsKbGwgczsKdmVjdG9yPGxsPiBhOwoKbmFtZXNwYWNlIHRhc2sxIHsKICAgIHZvaWQgc29sdmUoKSB7CiAgICAgICAgbGwgcmVzPTA7CiAgICAgICAgZm9yIChpbnQgbWFzaz0xO21hc2s8TUFTSyhuKTsrK21hc2spIHsKICAgICAgICAgICAgbGwgY3VyPTA7CiAgICAgICAgICAgIGZvciAoaW50IGk9MTtpPD1uOysraSkKICAgICAgICAgICAgaWYgKEJpdChtYXNrLGktMSkpIGN1cis9YVtpXTsKCiAgICAgICAgICAgIGlmIChjdXI9PXMpIHJlcysrOwogICAgICAgIH0KCiAgICAgICAgY291dDw8cmVzJU1vZDsKICAgIH0KfQoKbmFtZXNwYWNlIHRhc2syIHsKICAgIHZvaWQgc29sdmUoKSB7CiAgICAgICAgaW50IHJlcz0wOwogICAgICAgIHZlY3Rvcjx2ZWN0b3I8bGw+PiBkcChuKzMsdmVjdG9yPGxsPihzKzMsMCkpOwoKICAgICAgICBkcFswXVswXT0xOwogICAgICAgIGZvciAoaW50IGk9MTtpPD1uOysraSkKICAgICAgICBmb3IgKGludCBqPTA7ajw9czsrK2opIHsKICAgICAgICAgICAgZHBbaV1bal09ZHBbaS0xXVtqXTsKICAgICAgICAgICAgaWYgKGotYVtpXT49MCkgZHBbaV1bal09YWRkKGRwW2ldW2pdLGRwW2ktMV1bai1hW2ldXSxNb2QpOwogICAgICAgIH0KCiAgICAgICAgY291dDw8ZHBbbl1bc107CiAgICB9Cn0KCm5hbWVzcGFjZSB0YXNrMyB7CiAgICB2ZWN0b3I8aW50PiByZXMxLHJlczI7CgogICAgdm9pZCBUcnkxKGludCBpLGxsIHN1bSkgewogICAgICAgIGlmIChzdW0+cykgcmV0dXJuOwogICAgICAgIGlmIChpPT1uLzIrMSkgcmVzMS5wYihzdW0pOwogICAgICAgIGVsc2UgewogICAgICAgICBUcnkxKGkrMSxzdW0rYVtpXSk7CiAgICAgICAgIFRyeTEoaSsxLHN1bSk7CiAgICAgICAgfQogICAgfQoKICAgIHZvaWQgVHJ5MihpbnQgaSxsbCBzdW0pIHsKICAgICAgICBpZiAoc3VtPnMpIHJldHVybjsKICAgICAgICBpZiAoaT09bisxKSByZXMyLnBiKHN1bSk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFRyeTIoaSsxLHN1bSthW2ldKTsKICAgICAgICAgICAgVHJ5MihpKzEsc3VtKTsKICAgICAgICB9CiAgICB9CgogICAgdm9pZCBzb2x2ZSgpIHsKICAgICAgICBsbCBhbnM9MDsKICAgICAgICBUcnkxKDEsMCk7CiAgICAgICAgVHJ5MihuLzIrMSwwKTsKICAgICAgICBzb3J0KGFsbChyZXMxKSk7CiAgICAgICAgZm9yKGxsIHg6cmVzMikgewogICAgICAgICAgIGludCB0bXAxPXVwcGVyX2JvdW5kKGFsbChyZXMxKSxzLXgpLXJlczEuYmVnaW4oKTsKICAgICAgICAgICBpbnQgdG1wMj1sb3dlcl9ib3VuZChhbGwocmVzMSkscy14KS1yZXMxLmJlZ2luKCk7CgogICAgICAgICAgIGFucz1hZGQoYW5zLHRtcDEtdG1wMixNb2QpOwogICAgICAgICAgIC8vYW5zKz10bXAxLXRtcDI7CiAgICAgICAgfQoKICAgICAgICBjb3V0PDxhbnM7CiAgICB9Cn0KCnN0YXJ0KCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IGNpbi50aWUoMCk7IGNvdXQudGllKDApOwogICAgT3BlbkZpbGUoIlRBU0siKTsKCiAgICAvL01ha2VJbnAoKTsKICAgIGNpbj4+bj4+czsKCiAgICBhLmViKDApOwogICAgZm9yIChpbnQgaT0xO2k8PW47KytpKSB7CiAgICAgICAgbGwgeDsgY2luPj54OwogICAgICAgIGEuZWIoeCk7CiAgICB9CgogICAgLy90YXNrMTo6c29sdmUoKTsKICAgIC8vdGFzazI6OnNvbHZlKCk7CiAgICAvL3Rhc2szOjpzb2x2ZSgpOwoKICAgIGlmIChuPD0yMCkgdGFzazE6OnNvbHZlKCk7IGVsc2UKICAgIGlmIChuPD00MCkgdGFzazI6OnNvbHZlKCk7IGVsc2UgdGFzazM6OnNvbHZlKCk7CgoKCgoKCiAgICAvL2NlcnI8PCJcbkJpZW4gZGljaCB0aGFuaCBjb25nXG5UaW1lOiAiPDwoMS4wKmNsb2NrKCkvQ0xPQ0tTX1BFUl9TRUMpPDwiIHNcbiI7CiAgICByZXR1cm4gMDsKfQo=