#include <bits/stdc++.h>
using namespace std;
long long spf[10000001];
void FAST() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
}
int Rselect(vector<int>&, int, int, int);
int partition(vector<int>&, int, int);
void scanc(vector<char>& v, long long n) {
  for (long long i = 0; i < n; i++) {
    char num;
    cin >> num;
    v.push_back(num);
  }
}
template <typename T>
ostream& operator<<(ostream& stream, const vector<T>& vec) {
  for (auto& i : vec) {
    stream << i << ' ';
  }
  stream << '\n';
  return stream;
}
template <class T>
istream& operator>>(istream& stream, vector<T>& vec) {
  for (auto& i : vec) {
    stream >> i;
  }
  return stream;
}
void solve();
void sieve() {
  spf[1] = 1;
  for (long long i = 2; i < 10000001; i++) spf[i] = i;
  for (long long i = 4; i < 10000001; i += 2) spf[i] = 2;
  for (long long i = 3; i * i < 10000001; i++) {
    if (spf[i] == i) {
      for (long long j = i * i; j < 10000001; j += i) {
        if (spf[j] == j) spf[j] = i;
      }
    }
  }
}
vector<long long> getFactorization(long long x) {
  vector<long long> ret;
  while (x != 1) {
    ret.push_back(spf[x]);
    x = x / spf[x];
  }
  return ret;
}
void scanN(vector<long long>& v, long long n) {
  for (long long i = 0; i < n; i++) {
    int num;
    cin >> num;
    v.push_back(num);
  }
}
void scans(vector<string>& v, long long n) {
  for (long long i = 0; i < n; i++) {
    string s;
    cin >> s;
    v.push_back(s);
  }
}
long long modfactorial(long long n, long long p) {
  if (n >= p) return 0;
  long long result = 1;
  for (long long i = 1; i < n + 1; i++) {
    result = result * i;
    result = result % p;
  }
  return result;
}
long long MI(long long a, long long b, long long s0, long long s1) {
  long long k = b;
  if (b == 0)
    return s0;
  else {
    return MI(b, a % b, s1, s0 - s1 * (a / b));
  }
}
long long choose(long long a, long long b, long long c) {
  if (a < b) return 0;
  long long x = modfactorial(a, c);
  long long y = modfactorial(b, c);
  long long z = modfactorial(a - b, c);
  long long y_ = MI(y, c, 1, 0);
  if (y_ < 0) y_ = y_ + c;
  long long z_ = MI(z, c, 1, 0);
  if (z_ < 0) z_ = z_ + c;
  long long mul = (x * y_) % c;
  mul = (mul * z_) % c;
  return mul;
}
void SOLT() {
  long long test;
  cin >> test;
  while (test--) {
    solve();
  }
}
long long modpow(long long n, long long p, long long k) {
  if (p == 0) return 1;
  long long result = 1;
  long long i = 1;
  while (i <= p) {
    result = result * n;
    result = result % k;
  }
  return result;
}
bool isPrime(int a) {
  for (int i = 2; i * i <= a; ++i)
    if (a % i == 0) return false;
  return true;
}
bool useflushdivisible(long long a) {
  cout << a << endl;
  fflush(stdout);
  char sl[10];
  scanf("%s", sl);
  return sl[0] == 'y' || sl[0] == 'Y';
}
long long phi(long long n) {
  long long result = n;
  for (long long i = 2; i * i <= n; i++) {
    if (n % i == 0) {
      while (n % i == 0) n = n / i;
      result = result - result / i;
    }
  }
  if (n > 1) result = result - result / n;
  return result;
}
int main() {
  FAST();
  SOLT();
  return 0;
}
void solve() {
  long long n;
  cin >> n;
  vector<long long> e;
  scanN(e, n);
  sort(begin(e), end(e));
  long long i = 0;
  long long ans = 0;
  long long indx = 0;
  while (i < n) {
    if (e[i] <= i + 1 - indx) {
      ans++;
      indx = i + 1;
    }
    i++;
  }
  cout << ans << endl;
}
int Rselect(vector<int>& v, int i, int l, int r) {
  if (l == r) return v[l];
  int pivot = partition(v, l, r);
  if (pivot == i)
    return v[pivot - 1];
  else if (pivot < i) {
    return Rselect(v, i, pivot, r);
  } else {
    return Rselect(v, i, l, pivot - 2);
  }
}
int partition(vector<int>& v, int l, int r) {
  int pivot_index = rand() % (r - l + 1) + l;
  swap(v[pivot_index], v[l]);
  int i = l + 1, j = l + 1;
  while (j <= r) {
    if (v[j] < v[l]) {
      swap(v[j], v[i]);
      i++;
    }
    j++;
  }
  swap(v[l], v[i - 1]);
  return i;
}
