HDU 5207 Greatest Greatest Common Divisor

来源:互联网 发布:计算机编程语言有哪些 编辑:程序博客网 时间:2024/06/05 09:22

题意:求一些数之中两个数的最大公约数

比赛时的做法是:对每一个数求因子 标记每一个因子 如果该因子已经被标记过 则说明存在2个数的公因子是它 与答案取优即可 复杂度O(n根号n)(写的不优美可能会T)

另外一种做法是:对每个数进行标记,枚举某一答案的若干倍,如果当前的答案有2个倍数被标记过,则可以取到 复杂度O(nln(n))

#include<iostream>#include<cstdio>#include<cstring>#include<cctype>#include<cmath>#include<vector>#include<queue>#include<map>#include<algorithm>#include<set>#define scnaf scanf#define cahr char#define bug puts("bugbugbug");using namespace std;typedef long long ll;const int mod=1000000007;const int maxn=1e5+50;const int inf=1e9;const int maxe=200000;int a[maxn],visit[maxn];int main(){    int T_T,test=1;    scanf("%d",&T_T);    while(T_T--)    {        int n,ans=0;        scnaf("%d",&n);        memset(visit,0,sizeof(visit));        for(int i=0;i<n;i++)        {            scanf("%d",&a[i]);            int l=sqrt(a[i]+1);            for(int j=1;j<=l&&j<=a[i];j++)            if(a[i]%j==0)            {                if(visit[j]) ans=max(ans,j);                visit[j]=1;                if(visit[a[i]/j]) ans=max(ans,a[i]/j);                visit[a[i]/j]=1;            }        }        printf("Case #%d: %d\n",test++,ans);    }    return 0;}




0 0
原创粉丝点击