题解:
先将所得数列用map计数并sort,然后取其中最大的数(其必为a[n]中数),然后依次从大向小取数,判断其map中的数目是否大于0,大于0则其必为a[n]中数**,并将其分别与已确定的a[n]中数的gcd在map中的数目减2(因为gcd(i,j) = gcd(j,i))**,每次确定一个a[i]时,其在map中的数目减1。
AC代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 500+10;
LL gcd(LL a, LL b)
{
return b == 0? a:gcd(b,a%b);
}
int n;
int a[maxn*maxn];
vector <int> ans;
map <int,int> cnt;
int main()
{
scanf("%d",&n);
n *= n;
for(int i = 0; i < n; i++)
{
scanf("%d",&a[i]);
if(cnt.count(a[i]) == 0) cnt[a[i]] = 1;
else cnt[a[i]] ++;
}
sort(a,a+n);
ans.push_back(a[n-1]);
cnt[a[n-1]]--;
for(int i = n-2; i >= 0; i--)
{
if(cnt[a[i]] > 0)
{
for(int j = 0; j < ans.size(); j++)
cnt[gcd(a[i],ans[j])] -= 2;
cnt[a[i]]--;
ans.push_back(a[i]);
}
}
for(int i = 0; i < ans.size(); i++)
printf("%d ",ans[i]);
printf("\n");
}