#pragma optimization_level 3 #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,O3") #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx") #pragma GCC optimize("Ofast") #pragma GCC target("avx,avx2,fma") #pragma GCC optimization ("unroll-loops") #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,vector&rev){ 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]; } 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]; int s=n+1+n+1-1,B=32-__builtin_clz(s),fn=1<L(fn),R(fn),out(fn); // how many ways to take i items from left with weight myw vectorrev(fn); for(int my=0;mysync_with_stdio(0); cin.exceptions(cin.failbit); cout<>tc; while(tc--)ProGamerMove(); }