题目:
http://codeforces.com/problemset/problem/582/A
题意:
给出n个数字互相之间的所有n*n个gcd的值,求这n个数是什么。
思路:
这n个数一定就是对角线上的数,直接降序排列然后暴力找,每次找到的最大的数一定是其中一个数,然后求出它与已经求出的所有数的gcd在队列中去掉两个这个gcd数,保证所有大于等于下一个数字的gcd一定都被去掉了,剩下的最大的又是要找的数。
代码:
#include<bits/stdc++.h>
using namespace std;
#define N 302345
int n,m;
int flag,sum,ave,ans,res,len,ans1,ans2;
int a[N],b[N];
int gcd(int x,int y)
{
if(x<y)x^=y,y^=x,x^=y;
int t;
while(y)
t=y,y=x%y,x=t;
return x;
}
int main()
{
int i,j,k,kk,t,x,y,z;
while(scanf("%d",&n)!=EOF&&n)
{
for(i=1;i<=n*n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n*n+1);
priority_queue<int,vector<int>,less<int> > q;
k=0;
for(i=n*n;i>0;i--)
{
if(!q.empty()) t=q.top();
else t=0;
if(a[i]==t)
{
q.pop();
continue;
}
for(j=0;j<k;j++)
{
x=gcd(b[j],a[i]);
q.push(x);q.push(x);
}
b[k++]=a[i];
}
printf("%d",b[0]);
for(i=1;i<k;i++)
printf(" %d",b[i]);
printf("\n");
}
return 0;
}