zoukankan      html  css  js  c++  java
  • 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 le T le 15)T (1T15),表示数据组数。
    
    接下去有TT组数据,每组数据的第一行有一个正整数n  (1 le n le 100)n (1n100).
    
    第二行有nn个正整数a_1, ldots, a_n  (1 le a_1, ldots ,a_n le 2	imes 10^9)a1,,an (1a1,,an2×109), 表示这个数列。
    
    输出描述
    输出TTTT个数表示每次询问的答案。
    
    输入样例
    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;
    }
    



    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Ant 执行 exec cmd.exe 时路径包含空格的问题
    时区时差换算(GMT,UTC,PST,PDT)
    windows 共存多个位数不同的jdk时,eclipse的报错对应措施
    Windows下查询指定端口进程,并杀死
    关于windows的jdk
    第一阶段工作总结
    mac配置git mergetool为p4merge(2013笔记整理)
    ubuntu 14.04 安装压缩包版mysql
    关于微信公众号内嵌网页的几个meta标签
    关于js的keyCode
  • 原文地址:https://www.cnblogs.com/lightspeedsmallson/p/4899597.html
Copyright © 2011-2022 走看看