1002 ( HDU 5428 ) The Factor
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
有一个数列,FancyCoder沉迷于研究这个数列的乘积相关问题,但是它们的乘积往往非常大。幸运的是,FancyCoder只需要找到这个巨大乘积的最小的满足如下规则的因子:这个因子包含大于两个因子(包括它本身;比如,4有3个因子,因此它是满足这个要求的一个数)。你需要找到这个数字并输出它。但是我们知道,对于某些数可能没有这样的因子;在这样的情况下,请输出-1.
输入描述
输入文件的第一行有一个正整数T (1≤T≤15),表示数据组数。 接下去有T组数据,每组数据的第一行有一个正整数n (1≤n≤100). 第二行有n个正整数a1,…,an (1≤a1,…,an≤2×109), 表示这个数列。
输出描述
输出T行T个数表示每次询问的答案。
输入样例
2 3 1 2 3 5 6 6 6 6 6
输出样例
6 4
分析:对于每一个数字,它有用的部分其实只有它的所有质因子
(包括相等的)。求出所有数的所有质因子中最小的两个,相乘
就是答案。如果所有数字的质因子个数不到两个,那么就是无解。
时间复杂度(。
其实是出题人写的我也不知道要写什么 直接。。。。。。
/*
Problem : HDU5428 ( The Factor )
Exe.Time 0MS Exe.Memory 1580K
Code Len. 1104 B Language G++
*/
#include
#include
#include
#include
using namespace std;
int main()
{
int t,n,i,j,top;
long long a[102],b[600];
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
top=0;
for(i=0; i
1) {b[top+kk]=temp/j;kk++;} ///避免找不全 比如a[i]=2*7 temp/=j; flag=1; } if(kk>=3) break; ///如果有a[i]能分解2最小的因子直接break } top+=kk; if(flag==0&&a[i]!=1) ///如果不能分解且不是1 就是本身 b[top++]=a[i]; } sort(b,b+top); if(top<=1) { printf("-1\n"); } else { printf("%lld\n",b[0]*b[1]); } } return 0; }