#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef vector<ll> vi;

#define rep(i, a, b) for(int i = a; i < (b); i++)
#define sz(x) ((int)x.size())

void solve() {
  int N, K; cin >> N >> K;
  multiset<int> videos;
  int videos_geq_k = 0;
  rep(i, 0, N) {
    int d; cin >> d;
    if (d >= K) {
      videos_geq_k++;
    } else {
      videos.insert(d);
    }
  }
  int ans = 0;
  while (sz(videos) >= 2) {
    int x = *videos.begin();
    auto p = videos.upper_bound(K-x-1);
    if (p == videos.begin()) break;
    p = prev(p);
    if (p == videos.begin()) break;
    int y = *p;
    videos.erase(p);
    videos.erase(videos.begin());

    assert(x+y < K);

    if (videos_geq_k > 0) {
      videos_geq_k--;
      if (videos_geq_k > 0 || sz(videos) > 0) ans++;
    } else if (sz(videos) > 0){
      videos.erase(prev(end(videos)));
      if (videos_geq_k > 0 || sz(videos) > 0) ans++;
    }
  }
  while (sz(videos) >= 1) {
    videos.erase(videos.begin());
    if (videos_geq_k > 0) {
      videos_geq_k--;
      if (videos_geq_k > 0 || sz(videos) > 0) ans++;
    } else if (sz(videos) > 0){
      videos.erase(prev(end(videos)));
      if (videos_geq_k > 0 || sz(videos) > 0) ans++;
    }
  }
  if (videos_geq_k > 0) {
    ans += videos_geq_k-1;
  }
  cout << ans << '\n';
}

int main() {
  int T; cin >> T;
  rep(i, 0, T) solve();
  cout << flush;
}