您的位置:首页 > 其它

Hdu 5207 Greatest Greatest Common Divisor(数论)

2015-04-20 17:07 591 查看
题目链接

Greatest Greatest Common Divisor

Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 567 Accepted Submission(s): 257



[align=left]Problem Description[/align]
Pick two numbers ai,aj(i≠j)
from a sequence to maximize the value of their greatest common divisor.

[align=left]Input[/align]
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.

[align=left]Output[/align]
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.

[align=left]Sample Input[/align]

2
4
1 2 3 4
3
3 6 9


[align=left]Sample Output[/align]

Case #1: 2
Case #2: 3


[align=left]Source[/align]
BestCoder Round #38 ($)

题意:从n个数中,找出两个数之间的最大公约数的最大值。每个数<=100000,n<=100000。

题解:先用nlgn的方法预处理出1到10^5的数的约数。然后再统计出n个数中,每个数是多少个数的约数。最后的答案就是找所有约数中个数大于1的最大的数。

代码如下:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<vector>
#define nn 110000
typedef long long LL;
const int inf=0x3fffffff;
const LL inf64=(LL)inf*inf;
using namespace std;
vector<int>ve[nn];
int num[nn],n;
void init()
{
int i,j;
for(i=1;i<=100000;i++)
{
for(j=1;(LL)i*j<=100000;j++)
{
ve[i*j].push_back(i);
}
}
}
int main()
{
init();
int t,cas=1;
int i,j,x;
scanf("%d",&t);
while(t--)
{
memset(num,0,sizeof(num));
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
for(j=0;j<(int)ve[x].size();j++)
{
num[ve[x][j]]++;
}
}
for(j=100000;j>=1;j--)
{
if(num[j]>1)
break;
}
printf("Case #%d: %d\n",cas++,j);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: