#include <bits/stdc++.h>
using namespace std;
#define lli long long int
#define sv(a)          \
    for (auto &it : a) \
        cin >> it;
#define pv(a)              \
    for (auto it : a)      \
        cout << it << " "; \
    cout << '\n';
const int mod = 1e9 + 7;
const lli INF = 1e18 + 2;
typedef pair<int, int> pi; 

bool compareBysecond(pair<lli, lli> a, pair<lli, lli> b)
{
	return a.first > b.first;
}
int log(lli x)
{
	int cnt = 0;
	while (x > 0)
	{
		cnt++;
		x = x >> 1;
	}
	return cnt;
}
lli min(lli a, lli b)
{
	if(a > b) return b;
	else return a;
}
vector<int> prime(165,0);
void precompute()
{
	prime[1] = 1;
	for(int i = 2; i < 165 ; ++i)
	{
		
		for(int j = 2*i ; j < 165 ; j+=i)
		{
			prime[j] = 1;
		}
	}
	
	// cout << val[10] << endl;
}
lli gcd(lli a, lli b)
{
    if (!a)
       return b;
    return gcd(b%a,a);
}
int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);

#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	// freopen("output.txt", "w", stdout);
#endif

  // precompute();	
  int t;
  cin >> t;
 // pv(prime);
 // for(int i = 0 ; i < 165; ++i) if(prime[i] == 0) cout << i << " ";
  while(t--)
  {
  	int n, W;
  	cin >> n >> W;
  	multiset<int> st;
  	for(int i = 0; i < n ; ++i)
  	{
  		int w; cin >> w;
  		st.insert(w);
  	}
  	int cnt = 1, left = W;
  	while(!st.empty())
  	{
  		auto itr = st.upper_bound(left);
  		if(itr != st.begin())
  		{
  			itr--;
  			left -= *itr;
  			st.erase(itr);
  		}
  		else{
  			left = W;
  			cnt++;
  		}
  	}
  	cout << cnt << '\n';

  }
	return 0;

}