Greatest Greatest Common Divisor hdu 5207

来源:互联网 发布:java应用服务器有那些 编辑:程序博客网 时间:2024/05/18 21:40

Greatest Greatest Common Divisor

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 311    Accepted Submission(s): 132


Problem Description
Pick two numbers ai,aj(ij) from a sequence to maximize the value of their greatest common divisor.
 

Input
Multiple test cases. In the first line there is an integer T, indicating the number of test cases. For each test cases, the first line contains an integer n, the size of the sequence. Next line contains n numbers, from a1 to an1T100,2n105,1ai105. The case for n104 is no more than 10.
 

Output
For each test case, output one line. The output format is Case #xansx is the case number, starting from 1ans is the maximum value of greatest common divisor.
 

Sample Input
241 2 3 433 6 9
 

Sample Output
Case #1: 2

Case #2: 3

当时的题解是 
1002 Greatest Greatest Common Divisor由于出题人业(ying)界(yu)良(zhuo)心(ji),题面十分简洁,给定一组数,取两个数,使得gcd最大,这里提供两种做法。第一种先nlogn预处理出105所有数的因子,然后用cnt数组计数给定数的因子个数,再找到最大的i,满足cnt[i]>=2,复杂度为nlogn。第二种先用cnt计数给定数组,然后倒着枚举答案为d,计算k=1105/dcnt[kd],如果sum2,则d就是答案,复杂度为nlogn另外,大于104数据不超过10组有两个目的,一是放过nn的解法,二是使得数据读入量不大。
选择的是第二种方法,选得输入的最大的数,然后 倒着向前搜索, 如果成立sum>=2  则其肯定为最大公约数。
#include<stdio.h>#include<string.h>#define maxn 100010int main(){int bbs,n,m,i,j,max;int s[maxn];scanf("%d",&bbs);int k=1;while(bbs--){memset(s,0,sizeof(s));max=0;scanf("%d",&n);for(i=0;i<n;i++){scanf("%d",&m);s[m]++;if(m>max)max=m;}int sum;for(i=max;i>=0;i--){sum=0;for(j=i;j<=max;j+=i){sum+=s[j];if(sum>=2){break;}}if(sum>=2){printf("Case #%d: %d\n",k++,i);break;}}}return 0;}



0 0
原创粉丝点击