#include #include #include #include using namespace std; template class maxflow { struct edge {int to, rep; T cap; edge(int t, int r, T c) : to(t), rep(r), cap(c) {}}; std::vector> g; public: std::vector dis, id; maxflow(int n) : g(n), id(n), dis(n) {} void add_edge(int s, int t, T f) { g[s].push_back({t, (int)g[t].size() + (s == t), f}); g[t].push_back({s, (int)g[s].size() - 1, 0}); } T flow(int s, int t) { T ret = 0; while (bfs(s, t)) { id.assign(id.size(), 0); ret += path(s, t, T((1LL << 60) | (1 << 30))); } return ret; } bool bfs(int s, int t) { dis.assign(g.size(), g.size()); dis[s] = 0; std::queue q; for (q.push(s); !q.empty(); q.pop()) { int now = q.front(); for (auto &v : g[now]) { if (v.cap > 0 && dis[v.to] > dis[now] + 1) { dis[v.to] = dis[now] + 1; q.push(v.to); } } } return dis[t] < g.size(); } T path(int s, int t, T lim) { if (s == t) return lim; T now = 0; for (int &i = id[t]; i < g[t].size(); ++i) { auto &e = g[t][i], &re = g[e.to][e.rep]; if (re.cap <= 0 || dis[e.to] >= dis[t] || dis[e.to] < 0) continue; T tmp = path(s, e.to, std::min(lim - now, re.cap)); if (tmp == 0) continue; e.cap += tmp; re.cap -= tmp; now += tmp; if (now >= lim) break; } return now; } }; int main() { int n; cin >> n; vector a(5001, -1), cnt(5001); for (int i = 0; i < n; ++i) { int v; cin >> v; a[v] = i; ++cnt[v]; } maxflow mf(n + n + 2); int sorce = n + n, sink = sorce + 1; int pos = 0; for (int i = 1; i <= 5000; ++i) { if (cnt[i]) { mf.add_edge(sorce, pos, cnt[i]); a[i] = pos; ++pos; } } for (int i = 1; i <= n; ++i) { for (int j = 1; i * j <= 5000; ++j) { if (a[i * j] >= 0) mf.add_edge(a[i * j], n + i - 1, 1); } } int ans = n; for (int i = 0; i < n; ++i) { mf.add_edge(n + i, sink, 1); if (mf.bfs(sorce, sink)) { mf.id.assign(mf.id.size(), 0); mf.path(sorce, sink, 1); } else { ans = i; break; } } cout << ans << endl; }