博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
The Factor
阅读量:6335 次
发布时间:2019-06-22

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

The Factor

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 1274    Accepted Submission(s): 403

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×109), which denote these n positive integers. 
 
Output
Print 
T answers in T lines.
 
Sample Input
2
3
1 2 3
5
6 6 6 6 6
 
Sample Output
6 4
 
Source

 题意:给一数组。求数列的乘积的最小的满足条件的因子,该因子含有两个以上因子(包括自身。

解题思路:对数列中的每一个数,找出两个最小素数因子。然后对这些质数因子排序,最小的两个数乘积便是满足条件的因子。

intention:数比较大,long long。

1 #include
2 #include
3 #include
4 #include
5 6 using namespace std; 7 8 #define N 100000 //N*N > 10的9次方。素数表在N 以内就行。 9 10 long long b[N], num[N];11 int cnt = 0;12 13 void prim()14 {15 int a[N] = {
0};16 for(int i = 2; i < N; i++)17 {18 if(!a[i])19 {20 b[cnt++] = i;21 for(int j = i+i; j < N; j+=i)22 a[j] = 1;23 }24 }25 }26 27 int main()28 {29 int t, n;30 long long d;31 prim();32 scanf("%d", &t);33 while(t--)34 {35 int k = 0;36 37 scanf("%d", &n);38 while(n--)39 {40 scanf("%I64d", &d);41 int q = 0;42 for(int i = 0; i < cnt && b[i]<=d && q < 2; i++) // i
cnt,然而b[i]还是比d小,就会出现除数是0的情况……43 {44 while(d % b[i] == 0)45 {46 q++;47 d /= b[i];48 num[k++] = b[i];49 if(q >= 2)50 break;51 }52 }53 54 if(d != 1)55 num[k++] = d; // 素数表在N范围内,数据范围内的素数超过N,so,剩下的d如果不是1的话,可能是超过N的素数,例如 两个素数乘积2*10016959=20033918.所以10016959要存数组num中56 57 }58 sort(num, num+k);59 if(k < 2)60 printf("-1\n");61 else62 printf("%I64d\n", num[0]*num[1]);63 }64 return 0;65 }

思维严谨……

转载于:https://www.cnblogs.com/Tinamei/p/4789042.html

你可能感兴趣的文章
Git常用命令
查看>>
红帽虚拟化RHEV-架构简介
查看>>
二维条码扫描模组在肯德基KFC的无纸化点餐解决方案
查看>>
综合评价模型C++实现
查看>>
坐标系和坐标转换
查看>>
函数执行的预解释
查看>>
Thinkpad E450c进入BIOS
查看>>
nginx支持HTTP2的配置过程
查看>>
C. Day at the Beach
查看>>
技术学习网站
查看>>
js继承的方式
查看>>
【Splay】bzoj3224 Tyvj 1728 普通平衡树
查看>>
【dijkstra】【次短路】【fread】hdu6181 Two Paths
查看>>
python3支持excel读写
查看>>
工具:SVN的Web客户端(ViewVC、SVNWebClient、sventon)和任务管理(Trac、Collaboa)
查看>>
ubuntu关闭自动更新、打开 ubuntu 的 apport 崩溃检测报告功能
查看>>
vmlinux,zImage,bzImage,vmlinuz,uImage,关系
查看>>
会议管理拖动效果的页面制作1
查看>>
linux grep、find 命令详解
查看>>
Vuex详解笔记2
查看>>