Greatest Greatest Common Divisor
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
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: 2 Case #2: 3解题思路:cnt[i]记录因子为i的数的个数,接下来枚举i,找到最大的i使得cnt[i] >= 2即可。最开始用set超时了。#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn = 100005; int n,cnt[maxn]; int main() { int t,a,m,cas = 1; scanf("%d",&t); while(t--) { memset(cnt,0,sizeof(cnt)); scanf("%d",&n); m = 0; for(int i = 1; i <= n; i++) { scanf("%d",&a); m = max(m,a); int k = sqrt(a + 0.5); for(int j = 1; j <= k; j++) if(a % j == 0) { cnt[j]++; cnt[a/j]++; } if(k * k == a) cnt[k]--; } for(int i = m; i >= 1; i--) if(cnt[i] >= 2) { printf("Case #%d: %d\n",cas++,i); break; } } return 0; }