题意:给出n个数,问这n个数的乘积中最小的有至少三个因子的因子。
解法:除了1和质数的正整数都有至少三个因子,所以只要求那个乘积里最小的不为1的非质数因子就可以了,对每个数分解质因子,所有质因子中最小的两个之积即为答案,如果找不到两个质因子则不存在答案。注意longlong!注意longlong!注意longlong!重要的事情说三遍。
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long
using namespace std;
int cnt = 0;
int prime[45000];
void init()
{
bool isprime[45005] = {0};
for(int i = 2; i <= 45000; i++)
{
if(!isprime[i])
{
prime[cnt++] = i;
for(int j = i + i; j <= 45000; j += i)
isprime[j] = 1;
}
}
}
int main()
{
init();
int T;
while(~scanf("%d", &T))
{
while(T--)
{
int n;
int a[105];
vector <int> v;
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
int j = 0;
int x = a[i];
int flag = 0;
for(j = 0; j < cnt && a[i] >= prime[j]; j++)
{
while(a[i] % prime[j] == 0)
{
v.push_back(prime[j]);
flag = 1;
a[i] /= prime[j];
}
}
if(!flag && x != 1)
v.push_back(x);
}
sort(v.begin(), v.end());
//for(int i = 0; i < v.size(); i++)
//cout << v[i] << endl;
if(v.size() < 2) printf("-1\n");
else printf("%lld\n", (LL)v[0] * v[1]);
}
}
return 0;
}