#include #include #include #include #include int const MAXPRIME = 33000; int const MAXN = 10010; char mask[MAXPRIME + 1]; std::vector pr; int count_primes(int v) { int gr = (int)sqrt((double)v) + 1; int cnt = 0; bool is_prime = true; for (int i = 0; i < (int)pr.size() && pr[i] <= gr; ++ i) { int p = pr[i]; if (v % p == 0) { v /= p; if (v > 1) { //printf(" v=%d div by %d\n", v, p); is_prime = false; } ++ cnt; while (v % p == 0) v /= p; } } if (is_prime) return 0; if (v > 1) ++ cnt; return cnt; } int a[MAXN], cnt[MAXN], idx[MAXN]; bool my_cmp(int i, int j) { return cnt[i] < cnt[j] || (cnt[i] == cnt[j] && i < j); } int main() { memset(mask, 0, sizeof(mask)); for (unsigned i = 2; i <= MAXPRIME; ++ i) { if (mask[i] == 0) { pr.push_back(i); for (unsigned j = i + i; j <= MAXPRIME; j += i) mask[j] = 1; } } int n; scanf("%d", &n); for (int i = 0; i < n; ++ i) { scanf("%d", &a[i]); idx[i] = i; cnt[i] = count_primes(a[i]); //printf("--- %d: %d\n", a[i], cnt[i]); } std::sort(idx, idx + n, my_cmp); int pr_cnt = 0; while (pr_cnt < n && cnt[idx[pr_cnt]] == 0) ++ pr_cnt; printf("%d\n", pr_cnt); for (int i = pr_cnt; i < n; ++ i) printf("%d\n", a[idx[i]]); return 0; }