博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 5428 分解质因数
阅读量:4540 次
发布时间:2019-06-08

本文共 3148 字,大约阅读时间需要 10 分钟。

                                                                                               The Factor 

                                                                                                     Time Limit: 1 Sec  

                                                                                                     Memory Limit: 256 MB

题目连接

http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=628&pid=1001

Description

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

Input

输入文件的第一行有一个正整数T \ (1 \le T \le 15)T (1≤T≤15),表示数据组数。 接下去有TT组数据,每组数据的第一行有一个正整数n \ (1 \le n \le 100)n (1≤n≤100). 第二行有nn个正整数a_1, \ldots, a_n \ (1 \le a_1, \ldots ,a_n \le 2\times 10^9)a1,…,an (1≤a1,…,an≤2×109), 表示这个数列。

Output

输出TT行TT个数表示每次询问的答案。

Sample Input

231 2 356 6 6 6 6

Sample Output

64

HINT

 

题意

给你一个n个数

有一个数是由这N个数乘起来的,然后让你输出这个数的不是素数的最小的因子

题解:

对于每一个数都分解质因数,然后取最小的两个乘起来就好了

代码来自qseqesze

//1085422276#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std ;typedef long long ll;#define mem(a) memset(a,0,sizeof(a))#define meminf(a) memset(a,127,sizeof(a));#define TS printf("111111\n");#define FOR(i,a,b) for( int i=a;i<=b;i++)#define FORJ(i,a,b) for(int i=a;i>=b;i--)#define READ(a,b,c) scanf("%d%d%d",&a,&b,&c)#define inf 100000#define maxn 300000inline ll read(){ ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-')f=-1; ch=getchar();} while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();} return x*f;}//****************************************///****************************************************************/// Miller_Rabin 算法进行素数测试///速度快,而且可以判断 <2^63的数//****************************************************************const int S=20;///随机算法判定次数,S越大,判错概率越小///计算 (a*b)%c. a,b都是long long的数,直接相乘可能溢出的/// a,b,c <2^63long long mult_mod(long long a,long long b,long long c){ a%=c; b%=c; long long ret=0; while(b) { if(b&1){ret+=a;ret%=c;} a<<=1; if(a>=c)a%=c; b>>=1; } return ret;}///计算 x^n %clong long pow_mod(long long x,long long n,long long mod)//x^n%c{ if(n==1)return x%mod; x%=mod; long long tmp=x; long long ret=1; while(n) { if(n&1) ret=mult_mod(ret,tmp,mod); tmp=mult_mod(tmp,tmp,mod); n>>=1; } return ret;}///以a为基,n-1=x*2^t a^(n-1)=1(mod n) 验证n是不是合数///一定是合数返回true,不一定返回falsebool check(long long a,long long n,long long x,long long t){ long long ret=pow_mod(a,x,n); long long last=ret; for(int i=1;i<=t;i++) { ret=mult_mod(ret,ret,n); if(ret==1&&last!=1&&last!=n-1) return true;//合数 last=ret; } if(ret!=1) return true; return false;}/// Miller_Rabin()算法素数判定///是素数返回true.(可能是伪素数,但概率极小)///合数返回false;bool Miller_Rabin(long long n){ if(n<2)return false; if(n==2)return true; if((n&1)==0) return false;//偶数 long long x=n-1; long long t=0; while((x&1)==0){x>>=1;t++;} for(int i=0;i
=n)p=Pollard_rho(p,rand()%(n-1)+1); findfac(p); findfac(n/p);}//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ll p[maxn];int main(){ int t=read(); while(t--) { int n=read(); memset(Div,0,sizeof(Div)); tot=0; for(int i=1;i<=n;i++) { scanf("%I64d",&p[i]); if(p[i]!=1) findfac(p[i]); } sort(Div,Div+tot); if(tot<=1) printf("-1\n"); else { cout<
<
代码

 

转载于:https://www.cnblogs.com/zxhl/p/4788553.html

你可能感兴趣的文章
PAT甲级——A1130 Infix Expression【25】
查看>>
PAT甲级——A1126 Eulerian Path【30】
查看>>
PAT甲级——A1127 ZigZagging on a Tree【30】
查看>>
PAT甲级——A1010 Radix
查看>>
PAT甲级——A1012 The Best Rank
查看>>
左神算法书籍《程序员代码面试指南》——1_07生成窗口最大值数组
查看>>
左神算法进阶班6_1LFU缓存实现
查看>>
力扣算法题—460LFU缓存
查看>>
左神算法进阶班7_1求最大异或和的子数组
查看>>
左神算法进阶班7_2换钱组合数
查看>>
每天逛逛
查看>>
PAT甲级——【牛客练习A1004】
查看>>
PAT甲级——【牛客A1005】
查看>>
PAT甲级——A1001A+BFormat
查看>>
PAT甲级——A1002 A+B for Polynomials
查看>>
PAT甲级——A1003Emergency
查看>>
左神算法进阶班6_2字符串运算公式
查看>>
PAT甲级——A1004 Counting Leaves
查看>>
左神算法书籍《程序员代码面试指南》——1_01设计一个有getMin功能的栈
查看>>
左神算法进阶班8_1数组中累加和小于等于aim的最长子数组
查看>>