#define _USE_MATH_DEFINES #include using namespace std; // https://github.com/JaroslavUrbann/ICPC-library typedef long long ll; typedef long double ld; const int mod=167772161; // (119<<23)+1 template struct modnum{ int v; static int minv(int a,int m){return (a%=m)==1?1:m-ll(minv(m,a))*m/a;} static constexpr modnum root(){return R;} static constexpr int mod(){return M;} modnum():v(0){} modnum(ll v_):v(int(v_%M)){if(v<0)v+=M;} explicit operator int()const{return v;} explicit operator bool()const{return v;} friend ostream&operator<<(ostream&out,const modnum&a){return out<>(istream&in,modnum&a){ll v;in>>v;a=modnum(v);return in;} friend bool operator==(const modnum&a,const modnum&b){return a.v==b.v;} friend bool operator!=(const modnum&a,const modnum&b){return a.v!=b.v;} modnum inv()const{return modnum(minv(v,M));} friend modnum inv(const modnum&a){return a.inv();} modnum neg()const{return modnum(v?M-v:0);} friend modnum neg(const modnum&a){return a.neg();} modnum operator-()const{return neg();} modnum operator+()const{return *this;} modnum&operator++(){if(++v==M)v=0;return*this;} modnum&operator--(){if(!v--)v=M-1;return*this;} modnum&operator+=(const modnum&a){if((v+=a.v)>=M)v-=M;return*this;} modnum&operator-=(const modnum&a){if((v-=a.v)<0)v+=M;return*this;} modnum&operator*=(const modnum&a){v=ll(v)*a.v%M;return*this;} modnum&operator/=(const modnum&a){return*this*=a.inv();} friend modnum operator++(modnum&a,int){modnum r=a;++a;return r;} friend modnum operator--(modnum&a,int){modnum r=a;--a;return r;} friend modnum operator+(const modnum&a,const modnum&b){return modnum(a)+=b;} friend modnum operator-(const modnum&a,const modnum&b){return modnum(a)-=b;} friend modnum operator*(const modnum&a,const modnum&b){return modnum(a)*=b;} friend modnum operator/(const modnum&a,const modnum&b){return modnum(a)/=b;} friend modnum mpow(modnum a,ll b){ // change this to pow and you'll never debug your code modnum res=1; for(;b;b>>=1,a*=a)if(b&1)res*=a; return res; } }; using mint=modnum; // https://github.com/kth-competitive-programming/kactl/blob/main/content/numerical/NumberTheoreticTransform.h // multiply pointwise, divide by n, reverse(s+1,e), ntt again template void ntt(vector&a){ int n=a.size(),L=31-__builtin_clz(n); static vectorrt(2,1); for(static int k=2,s=2;k>s)}; for(int i=k;i<2*k;++i)rt[i]=rt[i/2]*z[i&1]; } vectorrev(n); for(int i=0;i vectorconv(const vector&a,const vector&b){ if(a.empty()||b.empty())return{}; int s=a.size()+b.size()-1,B=32-__builtin_clz(s),n=1<L(a),R(b),out(n); L.resize(n),R.resize(n); ntt(L),ntt(R); for(int i=0;i>>getdp(vectorw,int n,int k){ vector>>dp(n+1,vector>(n+1,vector(k+1))); // from first i items, taken j items, with weight l dp[0][0][0]=1; for(int i=1;i<=n;++i){ for(int j=0;j<=n;++j){ for(int l=0;l<=k;++l){ dp[i][j][l]=dp[i-1][j][l]+(j&&l>=w[i-1]?dp[i-1][j-1][l-w[i-1]]:0); } } } return dp; } void ProGamerMove(){ int n,k;cin>>n>>k; vectorw(n); for(int&v:w)cin>>v; auto dp1=getdp(w,n,k); reverse(w.begin(),w.end()); auto dp2=getdp(w,n,k); reverse(w.begin(),w.end()); vector>res(n,vector(n-1)); // my-th person screams, containing j items for(int i=0;i<=n;++i) for(int j=0;j<=n;++j) for(int l=k-1;l>=0;--l) dp2[i][j][l]+=dp2[i][j][l+1]; for(int my=0;myposl(n+1); // how many ways to take i items from left with weight myw for(int i=0;i<=n;++i)posl[i]=dp1[my][i][myw]; // for(int i=0;i<=n;++i)cerr<posr(n+1); // how many ways to take i items from right with weight at least k - myw - w[my] + 1 for(int i=0;i<=n;++i)posr[i]=dp2[n-my-1][i][max(0,k-myw-w[my]+1)]-(myw?dp2[n-my-1][i][k-myw+1]:0); // for(int i=0;i<=n;++i){ // cerr<sync_with_stdio(0); cin.exceptions(cin.failbit); cout<>tc; while(tc--)ProGamerMove(); }