【Codeforces 582A】 GCD Table
【题目链接】
【算法】
G中最大的数一定也是a中最大的数。
G中次大的数一定也是a中次大的数。
第三、第四可能是由最大和次大的gcd产生的
那么就不难想到下面的算法:
1. 令p为G中最大的数。在G中删除p,a中加入p。
2 . 对于a中的所有其他数(设为q),在G中删除2个gcd(p, q)。
3. 若G为空则结束;否则回到(1)。
【代码】
#include<bits/stdc++.h> using namespace std; #define MAXN 500 int i,N,x,k; map<int,int> M; int a[MAXN*MAXN]; vector<int> res; template <typename T> inline void read(T &x) { int f = 1; x = 0; char c = getchar(); for (; !isdigit(c); c = getchar()) { if (c == '-') f = -f; } for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - '0'; x *= f; } template <typename T> inline void write(T x) { if (x < 0) { putchar('-'); x = -x; } if (x > 9) write(x/10); putchar(x%10+'0'); } template <typename T> inline void writeln(T x) { write(x); puts(""); } inline int gcd(int x,int y) { return !y ? x : gcd(y,x%y); } int main() { read(N); for (i = 1; i <= N * N; i++) { read(a[i]); M[a[i]]++; } sort(a+1,a+N*N+1); for (i = N * N; i >= 1; i--) { if (!M[a[i]]) continue; --M[a[i]]; for (k = 0; k < res.size(); k++) M[gcd(a[i],res[k])] -= 2; res.push_back(a[i]); } for (i = 0; i < res.size(); i++) { write(res[i]); if (i < res.size() - 1) putchar(' '); } puts(""); return 0; }