hdu 5428 质因子

问题描述
有一个数列,FancyCoder沉迷于研究这个数列的乘积相关问题,但是它们的乘积往往非常大。幸运的是,FancyCoder只需要找到这个巨大乘积的最小的满足如下规则的因子:这个因子包含大于两个因子(包括它本身;比如,4有3个因子,因此它是满足这个要求的一个数)。你需要找到这个数字并输出它。但是我们知道,对于某些数可能没有这样的因子;在这样的情况下,请输出-1.

这个因子包含大于两个因子
也就是说必须包含三个因子可以为本身
求出所有数的所有质因子中最小的两个,相乘就是答案。
如果所有数字的质因子个数不到两个,那么就是无解


输入样例
2
3
1 2 3
5
6 6 6 6 6
输出样例
6
4

 

 1 # include <iostream>
 2 # include <cstdio>
 3 # include <cstring>
 4 # include <algorithm>
 5 # include <string>
 6 # include <cmath>
 7 # include <queue>
 8 # define LL long long
 9 using namespace std ;
10 
11 LL a[120] ;
12 LL vis[50000] ;
13 
14 int main ()
15 {
16     //freopen("in.txt","r",stdin) ;
17     int T ;
18     cin>>T ;
19     while(T--)
20     {
21         int n , i ;
22         int cnt = 0 ;
23         cin>>n ;
24         for (i = 0 ; i < n ; i++)
25             cin>>a[i] ;
26         memset(vis , 0 , sizeof(vis)) ;
27         for (i = 0 ; i < n ; i++)
28         {
29             LL x = a[i] ;
30             for (LL j = 2 ; j*j <= x ; j++)
31             {
32                 while(x%j==0)
33                 {
34                     vis[cnt++] = j ;
35                     x /= j ;
36                 }
37             }
38             if (x > 1)
39                 vis[cnt++] = x ;
40         }
41         sort(vis , vis+cnt) ;
42         if (cnt < 2)
43             cout<<-1<<endl ;
44         else
45             cout<<vis[0]*vis[1]<<endl ;
46 
47     }
48 
49     return 0 ;
50 }
View Code

 

posted @ 2015-09-20 16:09  __Meng  阅读(231)  评论(0编辑  收藏  举报