HDOJ 5428 The Factor(分解质因数)

来源:互联网 发布:法兰克王国 知乎 编辑:程序博客网 时间:2024/06/02 05:42

The Factor

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2415    Accepted Submission(s): 729


Problem Description
There is a sequence of n positive integers. Fancycoder is addicted to learn their product, but this product may be extremely huge! However, it is lucky that FancyCoder only needs to find out one factor of this huge product: the smallest factor that contains more than 2 factors(including itself; i.e. 4 has 3 factors so that it is a qualified factor). You need to find it out and print it. As we know, there may be none of such factors; in this occasion, please print -1 instead.
 

Input
The first line contains one integer T (1T15), which represents the number of testcases.

For each testcase, there are two lines:

1. The first line contains one integer denoting the value of n (1n100).

2. The second line contains n integers a1,,an (1a1,,an2×1 09                             ), which denote these n positive integers.
 

Output
Print T answers in T lines.
 

Sample Input
231 2 356 6 6 6 6
 

Sample Output
64
 

Source
BestCoder Round #54 (div.2)
 

思路:
这个题的题意就是,给你n个数,你要找出它们n个数的乘积所得的那个数的最小因素。所谓最小因素就是指 它是n个数乘积的因数,并且它含有至少三个因数(包括它自己)。就比如1*2*3所得结果是6,6的因子有2、3、6三个数。再比如6*6,36的因子有很多,但是它的最小因素是4,因为它的因子有2、2、4三个数。就是已知乘积让你找这样的最小因素。对于每一个数字,它有用的部分其实只有它的所有质因子(包括相等的)。求出所有数的所有质因子中最小的两个,相乘就是答案。如果所有数字的质因子个数不到两个,那么就是无解。所以说这个题的实质也就是分解质因数。


代码:
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;int a[1000000],vis[1000000];int countt;void prime(int x)//质因数分解 {     for(int i=2;i<=sqrt(x);i++)      {          while(x%i==0)          {              vis[countt]=i;              countt++;            x=x/i;          }      }      if(x!=1)      vis[countt++]=x;}int main(){    int T;    cin>>T;    while(T--)    {        int num;        cin>>num;        countt=0;        for(int i=0;i<num;i++)        {            cin>>a[i];            if(a[i]!=1)            prime(a[i]);        }        if(2+countt>=4)        {            sort(vis+0,vis+countt);            cout<<1LL*vis[0]*vis[1]<<endl;        }         else cout<<"-1"<<endl;    }    return 0;} 




0 0