#include<stdio.h>
#include<iostream>
#include<queue>
#include <algorithm>
using namespace std;
int n,m;
long long t;
int a[100010],front_sum[100010];
priority_queue<int,vector<int>,greater<int> >q;
bool huffman(int k)
{
long long sum=0;
while(!q.empty()) q.pop();
int mo=(n-1)%(k-1);
if(mo)
{
mo+=1;
sum+=front_sum[mo];
q.push(sum);
}
for(int i=mo; i<n; i++)
{
q.push(a[i]);
}
int tmp=0;
int up = (n - 1) / (k - 1);
for(int i = 0 ; i < up ; i ++)
{
tmp=0;
for(int j=0; j<k; j++)
{
tmp+=q.top();
q.pop();
}
q.push(tmp);
sum+=tmp;
}
if(sum<=m) return 1;
else return 0;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
front_sum[0]=0;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a , a+n);
for(int i=1;i<=n;i++)
front_sum[i]=front_sum[i-1]+a[i-1];
int h=n;
int l=2;
int mid;
while(h>l)
{
mid=(h+l)/2;
if(huffman(mid))
h=mid;
else
l=mid+1;
}
if(n <= 1) h = 1;
printf("%d\n",h);
}
return 0;
}
/*
1
5 25
1 2 3 4 5
*/
/*
k=3:
1 2 3 4 5 6
6 6 5 4
15 6//只有2个了……不够3个
21
42
3 3 4 5 6
5 6 10
21
34
所以当有空余的时候,先将前面的合并
*/
经实验,同样的代码会有不同的运行时间,相差至少0.2s