HDU 5207 Greatest Greatest Common Divisor

来源:互联网 发布:数据库流程 编辑:程序博客网 时间:2024/05/16 00:32

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 ai,aj(ij) from a sequence to maximize the value of their greatest common divisor.
 


Input
Multiple test cases. In the first line there is an integerT, indicating the number of test cases. For each test cases, the first line contains an integern, the size of the sequence. Next line contains n numbers, from a1 to an.1T100,2n105,1ai105. The case for n104 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
241 2 3 433 6 9
 


Sample Output
Case #1: 2Case #2: 3
 


Source
BestCoder Round #38 ($)
 


题意 给你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;}



0 0
原创粉丝点击