这是一个贪心的题,输入的数里面肯定会有像gcd(a[i],a[i])这样的数,输入里最大的数肯定是结果中的一个,然后去掉这个数与已知的其他数gcd的结果后,在重复找最大值,直到找完。
我是用的map和优先队列。
#include<stdio.h>
#include<iostream>
#include<queue>
#include<vector>
#include<map>
#include<cstring>
using namespace std;
const int INF=0x3f3f3f3f;
typedef long long ll;
int n;
map<ll,ll> M;
priority_queue <ll,vector<ll>,less<ll> > q;
ll gcd(ll a,ll b){
return b==0?a:gcd(b,a%b);
}
ll ans[10005],a[300005];
int main()
{
int k=0;
scanf("%d",&n);
for(int i=0;i<n*n;i++){
scanf("%lld",&a[i]);
if(M[a[i]]==0)
q.push(a[i]);
M[a[i]]++;
}
while(!q.empty()){
ll t=q.top();
if(M[t]>0){
ans[k]=t;
M[t]--;
for(int i=0;i<k;i++){
ll temp=gcd(ans[i],t);
M[temp]-=2;
}
k++;
}
if(M[t]==0)
q.pop();
}
for(int i=0;i<k;i++){
if(i==k-1)
printf("%lld\n",ans[i]);
else
printf("%lld ",ans[i]);
}
return 0;
}