题解:给你一个n*n的矩阵里面的是n个数互相gcd得出的结果,求出原来的数组
最大的数肯定是自己与自己gcd得出的结果,然后再去找最大的数,让已得到的结果与他gcd,将得出的数字减去2(因为表中的数字是对称的),然后再继续.......
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<map>
using namespace std;
typedef long long ll;
int n;
const int maxn=500*500+7;
int num[maxn];
vector<int> vec;
map<int,int> ma;
ll gcd(ll a,ll b){
return b==0?a:gcd(b,a%b);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n*n;i++){
scanf("%d",&num[i]);
ma[num[i]]++;
}
sort(num+1,num+n*n+1);
for(int i=n*n;i>=1;i--){
if(!ma[num[i]]) continue;
else{
ma[num[i]]--;
for(int j=0;j<vec.size();j++){
ma[gcd(vec[j],num[i])]-=2;
}
vec.push_back(num[i]);
}
}
for(int i=0;i<vec.size();i++){
cout<<vec[i]<<' ';
}
}