原题链接:
https://vjudge.net/problem/CodeForces-1165D
AC代码:
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int INF = 0x3fffffff;
void __init__()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
}
int main()
{
__init__();
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
set<int> ss;
long long a[1000];
for (int i = 0; i < n; i++)
{
cin >> a[i];
ss.insert(a[i]);
}
sort(a, a + n);
int flag = 0;
long long sum = a[0] * a[n - 1];
for (int i = 0; i < n; i++)
{
if (sum % a[i] != 0)
{
flag = 1;
break;
}
}
if (flag)
{
cout << "-1" << endl;
continue;
}
int cc = 0;
for (long long i = 2; i * i <= sum; i++)
{
if (sum % i == 0)
{
if (i * i == sum)
{
cc++;
}
else
cc += 2;
}
}
if (cc == n)
{
cout << sum << endl;
}
else
cout << "-1" << endl;
}
}
应该注意的是,本题要求所有的除数都应列举,少一个都不行,我们惊奇的发现,排好序之后两端相乘都是等于x的,因此当除了当 除数*除数==x之外,其余情况都是cnt+=2,遍历,统计最终cnt是否等于n。