HDU 5428:The Factor
The Factor
Accepts: 101
Submissions: 811
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
实际这个题目就是要在这些数的因子中取最小的素数和次小的素数相乘。明确了这个目的就好做题了。
代码:
#include <iostream> #include <algorithm> #include <cmath> #include <vector> #include <string> #include <cstring> #include <queue> #pragma warning(disable:4996) using namespace std; long long val[105]; const int N = 12005; bool prime[N]; int p[N]; int num_c[N]; int cnt; bool cmp(long long x,long long y) { return x<y; } void isprime() { cnt = 0; memset(prime,true,sizeof(prime)); for(int i=2; i<N; i++) { if(prime[i]) { p[cnt++] = i; for(int j=i+i; j<N; j+=i) prime[j] = false; } } } int main() { isprime(); long long i,k,t,num; cin>>t; while(t--) { memset(num_c,0,sizeof(num_c)); cin>>num; for (i = 0; i < num; i++) { cin >> val[i]; for(k=0; k<1437; k++) { if( val[i] % p[k] == 0) { while(val[i] % p[k] == 0) { num_c[p[k]]++; val[i] /= p[k]; } } } } sort(val,val+num,cmp); long long temp1=-1,temp2=-1; for(k=0;k<1437;k++) { if(num_c[p[k]]!=0) { temp1=p[k]; num_c[p[k]]--; break; } } for(k=0;k<1437;k++) { if(num_c[p[k]]!=0) { temp2=p[k]; num_c[p[k]]--; break; } } if(temp2<2&&temp1>1) { for (i = 0; i < num; i++) { if(val[i]>1) { temp2=val[i]; break; } } if(temp2<2) cout<<-1<<endl; else cout<<temp1*temp2<<endl; } else if(temp2<2&&temp1<2) { for (i = 0; i < num; i++) { if(val[i]>1) { temp1=val[i]; val[i]=0; break; } } for (i = 0; i < num; i++) { if(val[i]>1) { temp2=val[i]; val[i]=0; break; } } if(temp1<2||temp2<2) cout<<-1<<endl; else cout<<temp1*temp2<<endl; } else { cout<<temp1*temp2<<endl; } } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。