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(i≠j)
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
an
.
1≤T≤100,2≤n≤105,1≤ai≤105
. The case for
n≥104
is no more than
10
.
Output
For each test case, output one line. The output format is Case #
x
:
ans
,
x
is the case number, starting from
1
,
ans
is the maximum value of greatest common divisor.
Sample Input
2 4 1 2 3 4 3 3 6 9
Sample Output
Case #1: 2Case #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] ,如果 sum≥2 ,则 d 就是答案,复杂度为 nlogn 另外,大于 104 数据不超过 10 组有两个目的,一是放过 nn−−√ 的解法,二是使得数据读入量不大。选择的是第二种方法,选得输入的最大的数,然后 倒着向前搜索, 如果成立sum>=2 则其肯定为最大公约数。#include<stdio.h> #include<string.h> #define maxn 100010 int 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; }