HDU 5428 The Factor

题意:给出n个数,问这n个数的乘积中最小的有至少三个因子的因子。

 

解法:除了1和质数的正整数都有至少三个因子,所以只要求那个乘积里最小的不为1的非质数因子就可以了,对每个数分解质因子,所有质因子中最小的两个之积即为答案,如果找不到两个质因子则不存在答案。注意longlong!注意longlong!注意longlong!重要的事情说三遍。

 

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long

using namespace std;

int cnt = 0;
int prime[45000];
void init()
{
    bool isprime[45005] = {0};
    for(int i = 2; i <= 45000; i++)
    {
        if(!isprime[i])
        {
            prime[cnt++] = i;
            for(int j = i + i; j <= 45000; j += i)
                isprime[j] = 1;
        }
    }
}
int main()
{
    init();
    int T;
    while(~scanf("%d", &T))
    {
        while(T--)
        {
            int n;
            int a[105];
            vector <int> v;
            scanf("%d", &n);
            for(int i = 0; i < n; i++)
            {
                scanf("%d", &a[i]);
                int j = 0;
                int x = a[i];
                int flag = 0;
                for(j = 0; j < cnt && a[i] >= prime[j]; j++)
                {
                    while(a[i] % prime[j] == 0)
                    {
                        v.push_back(prime[j]);
                        flag = 1;
                        a[i] /= prime[j];
                    }
                }
                if(!flag && x != 1)
                    v.push_back(x);
            }
            sort(v.begin(), v.end());
            //for(int i = 0; i < v.size(); i++)
                //cout << v[i] << endl;
            if(v.size() < 2) printf("-1\n");
            else printf("%lld\n", (LL)v[0] * v[1]);
        }
    }
    return 0;
}

  

posted @ 2015-09-06 10:45  露儿大人  阅读(452)  评论(2编辑  收藏  举报