您的位置:首页 > 其它

HDU 5428:The Factor

2015-09-06 22:33 363 查看


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 \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)a​1​​,…,a​n​​ (1≤a​1​​,…,a​n​​≤2×10​9​​), 表示这个数列。

输出描述
输出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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: