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
做法很巧妙。记录每个数的所有因子,排序,再找整个数组里出现次数>=2的最大因子
#include<iostream>
#include<algorithm>
#include<string>
#include<map>
#include<vector>
#include<cmath>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
#define ll long long
using namespace std;
int x[100001];
int main(){
int t;
cin>>t;
int cnt=0;
while(t--){
memset(x,0,sizeof(x));
int n,a;
cin>>n;
int max=-1;
for(int i=0;i<n;++i){
cin>>a;
if(a>max)
max=a;
int g=sqrt((double)a);
for(int i=1;i<=g;++i){
if(a%i==0){
x[i]++;
x[a/i]++;
}
}
if(g*g==a)
x[g]--;
}
printf("Case #%d: ", ++cnt);
for(int i = max; i >= 1; i--){
if(x[i]>=2){
printf("%d\n",i);
break;
}
}
}
return 0;
}