#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int dp[109];
struct data
{
int c,w;
}s[109];
struct da
{
int num,p;
}f[109];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,i,v,j;
scanf("%d%d",&n,&v);
for(i=0;i<=v;i++)
{
dp[i]=0;f[i].num=0;f[i].p=0;
}
dp[0]=1;
for(i=1;i<=n;i++)
{
scanf("%d%d",&s[i].c,&s[i].w);
}
for(i=1;i<=n;i++)
{
for(j=v;j>=s[i].c;j--)
{
if(dp[j-s[i].c]!=0)
dp[j]+=dp[j-s[i].c];
}
}
printf("%d ",dp[v]);
f[0].num=1;
int mmax=0,add=1;
for(i=1;i<=n;i++)
{
for(j=v;j>=s[i].c;j--)
{
if(f[j-s[i].c].num!=0)
{
//f[j].p=max(f[j].p,f[j-s[i].c].p+s[i].w);
if(f[j].p<f[j-s[i].c].p+s[i].w)
{
f[j].p=f[j-s[i].c].p+s[i].w;
f[j].num=f[j-s[i].c].num;
continue;
}
if(f[j].p==f[j-s[i].c].p+s[i].w)
f[j].num+=f[j-s[i].c].num;
}
}
}
for(i=1;i<=v;i++)
{
mmax=max(f[i].p,mmax);
}
int all=0;
for(i=0;i<=v;i++)//一开始没有注意最优解最少有一个!!WA好久
{
if(f[i].p==mmax)
{
all+=f[i].num;
}
}
printf("%d\n",all);
}
return 0;
}