对角线上的元素就是a[i],而且在所在行和列中最大,
首先可以确定的是最大的元素一定是a[i]之一,这让人想到到了排序。
经过排序后,每次选最大的数字,如果不是之前更大数字的gcd,那么只能是a[i]之一。
div2路漫漫。。。
#include<bits/stdc++.h> using namespace std; typedef int ll; ll a[501]; int g[501*501]; ll gcd(ll a,ll b) { return b?gcd(b,a%b):a; } map<int,int> mp; //#define LOCAL int main() { #ifdef LOCAL freopen("in.txt","r",stdin); #endif int n; scanf("%d",&n); int sz = n*n; for(int i = 0; i < sz; i++){ scanf("%d",g+i); } sort(g,g+sz,greater<int>()); int c = 0,j = 0; a[c++] = g[j++]; for(int i = 1; i < n; i++){ while(j<sz && mp[g[j]]){ mp[g[j]]--; j++; } if(j == sz) break; for(int k = c-1; k >= 0; k--){ mp[gcd(a[k],g[j])] += 2; } a[c++] = g[j++]; } while(c--){ printf("%d",a[c]); if(c) putchar(' '); } return 0; }