rt,题目。
#include<bits/stdc++.h>
#define int long long
using namespace std;
bitset<10009> bs[49],z,gg;
int h,t;
int a[49];
void _main(){
h=t=1;//循环队列
for(int i=0;i<=45;i++){
bs[i].reset();
a[i]=0;
}
gg.reset();//为了判 0,记录所有的或
bs[h][0]=1;
gg|=bs[h];
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
int x;
cin>>x;
int g;
g=x;
z.reset();
int fl;
fl=0;//如果乘积太大就不要计算
for(int j=t;;j--,j+=40,j%=40){
if(g>m||fl==1){//g 爆掉 long long 的最后保障
fl=1;
g*=a[j];
if(!a[j]){//g 回归 0
fl=2;
}
if(j==h){
break;
}
continue;
}
z|=(bs[j]<<g);
g*=a[j];
if(!a[j]){
fl=2;
}
if(j==h){
break;
}
}
if(x==0){
while(t!=h){
int z;
z=t-1;
z+=40;
z%=40;
bs[z]|=bs[t];
t=z;
}
bs[h]|=gg;
}else if(x==1){
bs[t]|=z;
continue;
}
t++;
t%=40;
if(t==h){
gg|=bs[h];
bs[h].reset();
a[h]=0;
h++;
h%=40;
}
a[t]=x;
bs[t]=z;
gg|=z;
}
cout<<(bs[t][m]?"YES":"NO")<<endl;
return;
}
signed main(){
int t;
cin>>t;
while(t--){
_main();
}
return 0;
}