HDU 5428:The Factor
2015-09-06 22:33
363 查看
The Factor
Accepts: 101Submissions: 811
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
有一个数列,FancyCoder沉迷于研究这个数列的乘积相关问题,但是它们的乘积往往非常大。幸运的是,FancyCoder只需要找到这个巨大乘积的最小的满足如下规则的因子:这个因子包含大于两个因子(包括它本身;比如,4有3个因子,因此它是满足这个要求的一个数)。你需要找到这个数字并输出它。但是我们知道,对于某些数可能没有这样的因子;在这样的情况下,请输出-1.
输入描述
输入文件的第一行有一个正整数T \ (1 \le T \le 15)T (1≤T≤15),表示数据组数。 接下去有TT组数据,每组数据的第一行有一个正整数n \ (1 \le n \le 100)n (1≤n≤100). 第二行有nn个正整数a_1, \ldots, a_n \ (1 \le a_1, \ldots ,a_n \le 2\times 10^9)a1,…,an (1≤a1,…,an≤2×109), 表示这个数列。
输出描述
输出TT行TT个数表示每次询问的答案。
输入样例
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 ; int p ; int num_c ; 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; }
相关文章推荐
- 三星Remote Control开发遇到的坑
- 锁·——lock关键字详解
- HDU 5428:The Factor
- hadoop yarn简明教程
- hdfs简要教程
- [网络] TCP三次握手/四次挥手详解
- 绩效管理
- c+-----------------------------抽象类
- Winform设置按钮与窗体背景色一致
- iOS 颜色渐变
- 零基础学python-11.4 语句分隔符
- 零基础学python-11.4 语句分隔符
- 文件查找
- hadoop简要教程
- 创建自己的Cocoapods
- 谈谈App混合开发
- HTTP协议
- javascript slice()方法
- TCP的发送系列 — tcp_sendmsg()的实现(一)
- C/C++ IO细节