#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int gcd(int a,int b)
{
	
	if(b==0)
	return a;
	return gcd(b,a%b);
}
void merge(int arr[], int l, int m, int r)
{
    int i, j, k;
    int n1 = m - l + 1;
    int n2 =  r - m;
    int L[n1], R[n2];
    for (i = 0; i < n1; i++)
        L[i] = arr[l + i];
    for (j = 0; j < n2; j++)
        R[j] = arr[m + 1+ j];
    i = 0; // Initial index of first subarray
    j = 0; // Initial index of second subarray
    k = l; // Initial index of merged subarray
    while (i < n1 && j < n2) {
        if (L[i] <= R[j]) {
            arr[k] = L[i];
            i++;
        }
        else {
            arr[k] = R[j];
            j++;
        }
        k++;
    }
    while (i < n1) {
        arr[k] = L[i];
        i++;
        k++;
    }
    while (j < n2) {
        arr[k] = R[j];
        j++;
        k++;
    }
}
void mergeSort(int arr[], int l, int r) {
    if (l < r) {
        int m = l+(r-l)/2;
        mergeSort(arr, l, m);
        mergeSort(arr, m+1, r);
        merge(arr, l, m, r);
    }
}
void printArray(int A[], int size) {
    int i;
    for (i=0; i < size; i++)
        printf("%d ", A[i]);
    printf("\n");
}
int main() {
	// your code goes here
	ll t;
	cin>>t;
	while(t--)
	{
		ll n,w;
		cin>>n>>w;
		ll a[n],ans=0;
		for(ll i=0;i<n;i++)
		{
			cin>>a[i];
		}
		sort(a,a+n);
		multiset<ll>s;
		for(ll i=n-1;i>=0;i--)
		{
			auto x=s.lower_bound(a[i]);
			if(x==s.end())
			{
				ans=ans+1;
				if(w-a[i]>0)
				{
					s.insert(w-a[i]);
				}
			}
			else
			{
				ll z=*x;
				s.erase(x);
				if(w-a[i]>0)
				{
					s.insert(z-a[i]);
				}
				
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}