链接: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
*/