#include using namespace std; const int maxl = (int)1e6 + 10; int lp[maxl]; int cnt[maxl]; vector d[maxl]; bool can(int n, int md, const vector &d) { int need = md * (n - (int)d.size()); for(int x: d) { if (x < md) need += md - x; else need -= (x - md) / 2; } return need <= 0; } int main() { lp[1] = 1; for(int i = 2; i < maxl; ++i) { if (lp[i] > 0) continue; for(int j = i; j < maxl; j += i) { if (lp[j] == 0) lp[j] = i; } } ios_base::sync_with_stdio(0); int t; cin >> t; while(t--) { int n; cin >> n; memset(cnt, 0, sizeof cnt); for(int i = 1; i < maxl; ++i) { d[i].clear(); } for(int i = 0; i < n; ++i) { int x; cin >> x; while(x > 1) { int p = lp[x]; int c = 0; while(x > 1 && x % p == 0) x /= p, c++; d[p].push_back(c); cnt[p] += c; } } int gcd = 1; for(int p = 2; p < maxl; ++p) { if (cnt[p] < n) continue; int lf = -1, rg = 20; while(rg - lf > 1) { int md = (lf + rg) / 2; if (md == -1 || can(n, md, d[p])) { lf = md; } else rg = md; } //lf now is the maximum power of p in gcd while(lf--) gcd *= p; } cout << gcd << '\n'; } return 0; }