#include <bits/stdc++.h>
using namespace std;
using ll = long long;
// Function to check if a number is a perfect square
bool isPerfectSquare(ll x) {
if (x < 0) return false;
ll r = sqrtl(x);
return r * r == x || (r + 1) * (r + 1) == x || (r - 1) * (r - 1) == x;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
vector<ll> a(n);
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
int max_sq = 0;
// Try all pairs (ai, aj)
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
ll d = a[j] - a[i];
vector<pair<ll, ll>> factors;
// Enumerate all (p, q) such that p * q = d
for (ll f = 1; f * f <= d; ++f) {
if (d % f == 0) {
ll p = f, q = d / f;
factors.push_back({p, q});
if (p != q) {
factors.push_back({q, p});
}
}
}
for (auto [p, q] : factors) {
if ((p + q) % 2 != 0 || (q - p) % 2 != 0) continue;
ll t = (p + q) / 2;
ll s = (q - p) / 2;
ll x = t * t - a[j];
if (x < 0) continue;
int count = 0;
for (int k = 0; k < n; ++k) {
if (isPerfectSquare(a[k] + x)) count++;
}
max_sq = max(max_sq, count);
}
}
}
// Also check x = 0
int count0 = 0;
for (int k = 0; k < n; ++k) {
if (isPerfectSquare(a[k])) count0++;
}
max_sq = max(max_sq, count0);
cout << max_sq << '\n';
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIGxsID0gbG9uZyBsb25nOwoKLy8gRnVuY3Rpb24gdG8gY2hlY2sgaWYgYSBudW1iZXIgaXMgYSBwZXJmZWN0IHNxdWFyZQpib29sIGlzUGVyZmVjdFNxdWFyZShsbCB4KSB7CiAgICBpZiAoeCA8IDApIHJldHVybiBmYWxzZTsKICAgIGxsIHIgPSBzcXJ0bCh4KTsKICAgIHJldHVybiByICogciA9PSB4IHx8IChyICsgMSkgKiAociArIDEpID09IHggfHwgKHIgLSAxKSAqIChyIC0gMSkgPT0geDsKfQoKaW50IG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKDApOwoKICAgIGludCB0OwogICAgY2luID4+IHQ7CiAgICB3aGlsZSAodC0tKSB7CiAgICAgICAgaW50IG47CiAgICAgICAgY2luID4+IG47CiAgICAgICAgdmVjdG9yPGxsPiBhKG4pOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICAgIGNpbiA+PiBhW2ldOwogICAgICAgIH0KCiAgICAgICAgaW50IG1heF9zcSA9IDA7CgogICAgICAgIC8vIFRyeSBhbGwgcGFpcnMgKGFpLCBhaikKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBuOyArK2opIHsKICAgICAgICAgICAgICAgIGxsIGQgPSBhW2pdIC0gYVtpXTsKICAgICAgICAgICAgICAgIHZlY3RvcjxwYWlyPGxsLCBsbD4+IGZhY3RvcnM7CgogICAgICAgICAgICAgICAgLy8gRW51bWVyYXRlIGFsbCAocCwgcSkgc3VjaCB0aGF0IHAgKiBxID0gZAogICAgICAgICAgICAgICAgZm9yIChsbCBmID0gMTsgZiAqIGYgPD0gZDsgKytmKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGQgJSBmID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGwgcCA9IGYsIHEgPSBkIC8gZjsKICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9ycy5wdXNoX2JhY2soe3AsIHF9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAgIT0gcSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9ycy5wdXNoX2JhY2soe3EsIHB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBmb3IgKGF1dG8gW3AsIHFdIDogZmFjdG9ycykgewogICAgICAgICAgICAgICAgICAgIGlmICgocCArIHEpICUgMiAhPSAwIHx8IChxIC0gcCkgJSAyICE9IDApIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgICAgICBsbCB0ID0gKHAgKyBxKSAvIDI7CiAgICAgICAgICAgICAgICAgICAgbGwgcyA9IChxIC0gcCkgLyAyOwoKICAgICAgICAgICAgICAgICAgICBsbCB4ID0gdCAqIHQgLSBhW2pdOwogICAgICAgICAgICAgICAgICAgIGlmICh4IDwgMCkgY29udGludWU7CgogICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IDA7CiAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBuOyArK2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGVyZmVjdFNxdWFyZShhW2tdICsgeCkpIGNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG1heF9zcSA9IG1heChtYXhfc3EsIGNvdW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gQWxzbyBjaGVjayB4ID0gMAogICAgICAgIGludCBjb3VudDAgPSAwOwogICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbjsgKytrKSB7CiAgICAgICAgICAgIGlmIChpc1BlcmZlY3RTcXVhcmUoYVtrXSkpIGNvdW50MCsrOwogICAgICAgIH0KICAgICAgICBtYXhfc3EgPSBtYXgobWF4X3NxLCBjb3VudDApOwoKICAgICAgICBjb3V0IDw8IG1heF9zcSA8PCAnXG4nOwogICAgfQoKICAgIHJldHVybiAwOwp9Cg==