HDU-5902-GCD is Funny

鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=5902

題意:給出數組a[],從中取出3個數,放回其中任意兩個數的GCD 兩次,直到最後剩下兩個數字,問最後剩下的數字可能有什麼。

題解:

跑n-2輪兩兩GCD,不斷更新gcd數組直到無新的數產出。

CODE:

#include <bits/stdc++.h>
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
#define INF 0x3f3f3f3f
#define LL long long
#define bug cout<<"bug"<<endl
const int MAXN = 1007;
const int MAXM = 20007;
const int MOD = 1e9 + 9;
using namespace std;
int num[MAXN];
int ans[MAXN];
int gcd(int x, int y)
{
    if(x==0)return y;
    return gcd(y%x,x);
}
int main()
{
    int T,n;
    scanf("%d",&T);
    while(T--)
    {
        memset(ans,0,sizeof(ans));
        scanf("%d",&n);
        for(int i=0; i<n; ++i)
        {
            scanf("%d",&num[i]);
            for(int j=0; j<i; ++j)
                ans[gcd(num[j],num[i])]=1;
        }
        int flag=1,cnt=n;
        while(flag && cnt>3)
        {
            cnt--;
            flag=0;
            for(int i=1; i<=1000; ++i)
            {
                if(ans[i])
                    for(int j=0; j<n; ++j)
                    {
                        int poi=gcd(i,num[j]);
                        if(!ans[poi])
                        {
                            flag=1;
                            ans[poi]=1;
                        }
                    }
            }
        }
        int p=1;
        for(int i=1; i<1001; ++i)
        {
            if(ans[i])
            {
                if(p)printf("%d",i),p--;
                else printf(" %d",i);
            }
        }
        printf("\n");
    }
    return 0;
}
/*
3
4
1 2 3 4
4
2 2 2 2
5
5 6 2 3 4
*/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章