Greatest Greatest Common Divisor
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 604 Accepted Submission(s): 276
Problem Description
Pick two numbers
a
i
,a
j
(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
a
1![]()
to
a
n![]()
.
1≤T≤100,2≤n≤10
5
,1≤a
i
≤10
5![]()
. The case for
n≥10
4![]()
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
Source
题意 给你n个数,求出n个数里面 选择两个数,使得公约数最大。
直接暴力显然是不行的 复杂度高达O(n^2)。
可以用筛法选出1到100000内所有数的因子,将它存入一个数组里面。
只有这个数组大于等于2则说明这个数就和其他数有公约数,可以从1e5往前暴力,则可以选出最大的公约数是多少。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstring>
#include <stdio.h>
using namespace std;
const int MAXN=1e5+1;
int a[100005][150];//第一维是数的大小,第二维是因子的个数。
int b[100005];
int c[100005];
int main()
{
int t,i,j;
for(i=1; i<MAXN; i++)
for(j=i; j<MAXN; j+=i)
{
a[j][b[j]++]=i; //暴力出所有的数的因子。
}
cin>>t;
int Case=0;
while(t--)
{
memset(c,0,sizeof(c));
int n,x;
cin>>n;
while(n--)
{
cin>>x;
for(i=0; i<b[x]; i++) //b[x]是因子的个数。
c[a[x][i]]++; //出现的数它的因子个数加一。
}
cout<<"Case"<<" "<<"#"<<++Case<<": ";
for(i=MAXN-1; i>0; i--)
{
if(c[i]>=2) //找到则输出。。
{
cout<<i<<endl;
break;
}
}
}
return 0;
}