https://codeforces.com/contest/2029/problem/E
发现2可以生成所有非质数。所以如果a中没有大于2的质数,就可以选2。
如果有质数,那么x必须选它,如果有两个质数,那么必定无解。
如果有一个质数x,那么接下来就是看x能不能生成其他所有数。
1.注意到x下一步只能生成2x,接下来可以生成所有大于等于2x的偶数。因此如果a[i]是偶数,那么判断它是否大于等于2*x,若否,则无解。
2.若a[i]是奇数。
2.1 注意到如果x生成了y,则代表x和y都有一个共同的除数z。要生成这个奇数,则考虑能不能生成 这个奇数 - 它的最小非1因子 或者其他之类的东西。
2.2 注意到奇数-它的最小非1因数 是偶数
2.3 因此如果这个奇数-最小质因数 小于等于2*x则无解,反之能被x生成。
#include<bits/stdc++.h>
#define LOCAL//delete when submit!!!!!!
#define MULTI_TEST
using namespace std;
using ll = long long;
using pii = pair<int,int>;
using pll = pair<ll,ll>;
std::vector<int> minp, primes;
void sieve(int n) {
minp.assign(n + 1, 0);
primes.clear();
for (int i = 2; i <= n; i++) {
if (minp[i] == 0) {
minp[i] = i;
primes.push_back(i);
}
for (auto p : primes) {
if (i * p > n) {
break;
}
minp[i * p] = p;
if (p == minp[i]) {
break;
}
}
}
}
bool isprime(int n) {
return minp[n] == n;
}
int n;
vector<int> a;
void solve(){
cin>>n;
a = vector<int>(n+1);
int x = 0;
for(int i=1;i<=n;i++){
cin>>a[i];
if(isprime(a[i])){
if(x==0) x = a[i];
else x = -1;
}
}
if(x==0||x==2) return cout<<"2\n",void();
if(x==-1) return cout<<"-1\n",void();
for(int i=1;i<=n;i++){
if(a[i]%x==0) continue;
if(a[i]%2==0 && a[i]>=2*x) continue;
if(a[i]%2){
if(a[i] - minp[a[i]]>=2*x) continue;
}
return cout<<"-1\n",void();
}
cout<<x<<endl;
}
int main(){
#ifdef LOCAL
freopen("in.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
std::ios::sync_with_stdio(0);std::cout.tie(0);std::cin.tie(0);
int T = 1;
#ifdef MULTI_TEST
cin>>T;
#endif
sieve(4e5+10);
while(T--){
solve();
}
return 0;
}