HDU 5428 [The Factor] 分解质因数

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5428

题目大意:给你若干个整数,让你输出这些数乘积的一个最小因子,并且这个因子至少有3个因子。

关键思想:分解质因数,我们要找的其实就是两个最小质因数的乘积。我的算法关键就是维护最小的两个质因数。

代码如下:

#include <iostream>
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
const int MAXN=105;
int min1,min2;

void PrimeFac(int n){//分解质因数
    bool flag=false;
    for(int i=2;i<=n;i++){
        while(n!=i){
            if(n%i==0){
                if(min1>min2)min1=min(i,min1);
                else min2=min(i,min2);
                n/=i;
            }else break;
        }
        if(i>=max(min1,min2)){
            return;
        }
    }
    if(min1>min2)min1=min(n,min1);
    else min2=min(n,min2);
    return;
} 

bool isPrime(int n){
    for(int i=2;i<=sqrt(n);i++){
        if(n%i==0)return false;
    }
    return true;
}

int main(){
    int T,n,tmp,ans;
    scanf("%d",&T);
    while(T--){
        min1=inf,min2=inf;
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            scanf("%d",&tmp);
            if(tmp==1)continue;
            if(isPrime(tmp)){
                if(min1>min2)min1=min(tmp,min1);
                else min2=min(tmp,min2);
            }else
                PrimeFac(tmp);
        }
        if(min1==inf||min2==inf)printf("-1\n");
        else printf("%lld\n",(long long)min1*min2);//结果可能超出int范围,WA了几发
    }
    return 0;
}
时间: 2024-11-12 03:45:52

HDU 5428 [The Factor] 分解质因数的相关文章

HDU 5428 The Factor 分解因式

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5428 The Factor Accepts: 101 Submissions: 811 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 有一个数列,FancyCoder沉迷于研究这个数列的乘积相关问题,但是它们的乘积往往非常大.幸运的是,FancyCoder只需要找到这个巨大

hdu 5428 The Factor(素数筛选合数分解)

题意:求一串数乘积的因子中的最小合数: 思路:比赛时枚举因子,枚举到两个时结束,估计超时,结果果然被叉了: 将每个数分解,取最小的两个质因子,若数目少于2,则不存在: #include<cstdio> #include<cstring> #include<vector> #include<algorithm> using namespace std; int t,n,m; int num[505]; const int MAXN=100000; int pr

HDU 5428 The Factor

题意:给出n个数,问这n个数的乘积中最小的有至少三个因子的因子. 解法:除了1和质数的正整数都有至少三个因子,所以只要求那个乘积里最小的不为1的非质数因子就可以了,对每个数分解质因子,所有质因子中最小的两个之积即为答案,如果找不到两个质因子则不存在答案.注意longlong!注意longlong!注意longlong!重要的事情说三遍. 代码: #include<stdio.h> #include<iostream> #include<algorithm> #inclu

大素数测试和分解质因数

Prime Test http://poj.org/problem?id=1811 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 typedef __int64 LL; 5 LL mulmod(LL a,LL b,LL c) { //ret=(a*b)%c 6 LL ret=0; 7 for(; b; a=(a<<1)%c,b>>=1) { 8 if(b&1) {

分解质因数模板

/*==================================================*| 分解质因数,可能有些地方需要改为long long \*==================================================*/ const int MAXN=100010; int prm[MAXN+1]; bool is[MAXN+1]; int getprm(int n){ int i, j, k = 0; int s, e = (int)(sqrt

数论 - Miller_Rabin素数测试 + pollard_rho算法分解质因数 ---- poj 1811 : Prime Test

Prime Test Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 29046   Accepted: 7342 Case Time Limit: 4000MS Description Given a big integer number, you are required to find out whether it's a prime number. Input The first line contains the

分解质因数算法

分解质因数算法 1.从N开始递减,找到满足 : n%i ==0 && n是素数 -> result2.存result到数组,递归执行(n/result) var result = new Array(); var factor = function f(n){ if(n == 1){return ;} var n1 = n; while(n1>1){ if(isPrime(n1) && n % n1 == 0) {break;} n1--; } if(n1 ==

大整数分解质因数(Pollard rho算法)

#include <iostream> #include <cstring> #include <cstdlib> #include <stdio.h> #include <algorithm> #include <math.h> #include <stdlib.h> #include<time.h> #define ll long long #define INF 0x3f3f3f3f #define ma

hdoj-1164-Eddy&#39;s research I【分解质因数】

Eddy's research I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7537 Accepted Submission(s): 4579 Problem Description Eddy's interest is very extensive, recently he is interested in prime number