/*
给你n个物品,每个物品有一定的体积,给你一个总体积一定的背包,
问你用这个背包去装这些物品的时候,背包中的物品共有几种不同的组合
一种组合是合法的:剩下的背包容量必须《剩下的物品的体积的最小值
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[1010];
int v[50];
int max(int a,int b){
return a>b?a:b;
}
int main(){
int t,i,j,k,V,D,ca=1;
scanf("%d",&t);
while(t--){
scanf("%d%d",&V,&D);
for(i=1;i<=V;i++) scanf("%d",&v[i]);
sort(v+1,v+V+1);int sum=0,ans=0;
for(i=1;i<=V;i++){//枚举未选集合中最小的商品,那比他小的肯定都已经在背包里了
memset(dp,0,sizeof(dp));dp[0]=1;dp[sum]=1;
for(j=i+1;j<=V;j++)
for(k=D;k>=v[j]+sum;k--)
dp[k]+=dp[k-v[j]];
for(j=D;j>=max(D-v[i]+1,1);j--)//保证D-j+1<=v[i];
if(j>=sum) ans+=dp[j];
sum+=v[i];
}
printf("%d %d\n",ca++,ans);
}
}