Codeforces Round #323 Div2 C: GCD Table

解法

テーブル上の既に明らかになっているGCDを取り除いた時に最大の数は、必ず元の配列に含まれているはずである。

コード

import java.util.ArrayList;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

public class Main {

    public void solve() {
	Scanner scanner = new Scanner(System.in);
	int n = scanner.nextInt();
	TreeMap<Integer, Integer> cnt = new TreeMap<>();
	for (int i = 0; i < n * n; ++i) {
	    int x = -scanner.nextInt();
	    Integer value = cnt.get(x);
	    if (value == null) {
		cnt.put(x, 1);
	    } else {
		cnt.put(x, value + 1);
	    }
	}
	scanner.close();

	ArrayList<Integer> ans = new ArrayList<>();
	for (Map.Entry<Integer, Integer> entry : cnt.entrySet()) {
	    int top = -entry.getKey();
	    while (entry.getValue() > 0) {

		for (int a : ans) {
		    int gcd = -gcd(top, a);
		    cnt.put(gcd, cnt.get(gcd) - 2);
		}

		ans.add(top);
		cnt.put(-top, cnt.get(-top) - 1);
	    }

	}

	for (int i = 0; i < n; ++i) {
	    System.out.print(ans.get(i) + " ");
	}
    }

    public static void main(String[] args) {
	new Main().solve();
    }

    // 最大公約数
    private int gcd(int a, int b) {

	return b == 0 ? a : gcd(b, a % b);
    }
}