#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define Lt Line #define Pt Point //#define ll ll #define Pd Point #define Ld Line #define LL ll #include #include #define debug(x) cout<<"DEBUG"< pii; typedef std::pair piii; using ld =long double; const ld PI = acosl(-1); const ld EPS = 1e-9; const ld INF = numeric_limits::max(); #define cc(x) cout << fixed << setprecision(x); const long long G = 3; const long long Gi = 1234567891; // 3 在模 998244353 下的逆元 ll qpow(ll a, ll b) { ll res = 1; while (b) { if (b & 1) res = (res * a) % MOD; a = (a * a) % MOD; b >>= 1; } return res; } ll qpow(ll a,ll b,const ll &mm) { ll res=1; while(b) { if(b&1) res=res*a%mm; a=a*a%mm; b>>=1; } return res; } ll n,m,g; ll dp[62][50010]; void reset() { } void solve() { cin>>n>>m; vector num(n); ll sum=0; for(auto &t:num) cin>>t,sum+=t; dp[0][0]=1; ll f; for(ll mask=0;mask<61;mask++) { for(ll j=0;j=0;i--) { if(dp[mask][i]==0) continue; dp[mask][i+num[j]]=(dp[mask][i+num[j]]+dp[mask][i])%MOD; } } f=(m&1); for(ll i=sum*2;i>=0;i--) { if((i&1)!=f) continue; dp[mask+1][i/2]=(dp[mask+1][i/2]+dp[mask][i])%MOD; } m/=2; } cout<>t_; while(t_--) { solve(); reset(); if(t_==0) break; cout<<'\n'; } // exit(0); return 0; } // 7 7 // 1 2 3 4 5 1 6 6