题目链接:点击打开链接
题目大意:
有一个数列,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