题目大意:
有一个数列,FancyCoder沉迷于研究这个数列的乘积相关问题,但是它们的乘积往往非常大。幸运的是,FancyCoder只需要找到这个巨大乘积的最小的满足如下规则的因子:这个因子包含大于两个因子(包括它本身;比如,4有3个因子,因此它是满足这个要求的一个数)。你需要找到这个数字并输出它。但是我们知道,对于某些数可能没有这样的因子;在这样的情况下,请输出-1.
也就是说,要你把这个序列的每个数拆成他们各自的质因子,然后将所有的因子排序,输出前面两个最小的因子的乘积。
详细解说看代码:
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e4;
int T,n;
long long fac[maxn]; //注意int存不下,要long long
long long i,j;
long long a;
int main()
{
cin>>T;
while(T--)
{
j=0;
cin>>n;
while(n--)
{
cin>>a;
long long m=(long long)sqrt(a+0.5);
for(i=2; i<=m; i++)
for(; a%i==0; j++)
{
fac[j]=i;
a/=i;
}
if(a!=1) //经过前面除之后,如果是质数,直接存上
fac[j++]=a; //注意这里的j++和都面的<2对应
}
if(j<2)
cout<<"-1"<<endl;
else
{
sort(fac,fac+j);
cout<<fac[0]*fac[1]<<endl;
}
}
return 0;
}
~step by step