#include <bits/stdc++.h>
using namespace std;
using Mask = unsigned long long;
int N, k;
vector<Mask> windows;
Mask fullMask;
bool dfs(int idx, int chosen, Mask used) {
if (chosen == k) return used == fullMask;
int rem = k - chosen;
int remainWindows = windows.size() - idx;
if (remainWindows < rem) return false;
for (int i = idx; i < windows.size(); ++i) {
Mask w = windows[i];
if ((w & used) == 0) {
if (dfs(i + 1, chosen + 1, used | w)) return true;
}
}
return false;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
while (T--) {
cin >> N;
vector<int> A(N);
for (int i = 0; i < N; ++i) cin >> A[i];
sort(A.begin(), A.end());
int best = 1;
fullMask = (N == 64 ? ~0ULL : ((1ULL << N) - 1));
// try block count k from max down
for (int blocks = N / 2; blocks >= 1; --blocks) {
if (N % blocks) continue;
int m = N / blocks;
if (m < 2) continue;
// collect possible D values from windows
set<int> Dvals;
for (int i = 0; i + m - 1 < N; ++i) {
Dvals.insert(A[i + m - 1] - A[i]);
}
bool found = false;
for (int D : Dvals) {
windows.clear();
// build windows masks
for (int i = 0; i + m - 1 < N; ++i) {
if (A[i + m - 1] - A[i] == D) {
Mask mask = 0;
for (int j = i; j < i + m; ++j) mask |= (1ULL << j);
windows.push_back(mask);
}
}
if (windows.size() < blocks) continue;
k = blocks;
// attempt cover
if (dfs(0, 0, 0ULL)) {
best = blocks;
found = true;
break;
}
}
if (found) break;
}
cout << best << '\n';
}
return 0;
}