#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; }