#include #include #define all(v) v.begin(), v.end() #define eb emplace_back #define fast cin.tie(nullptr); ios_base::sync_with_stdio(false) using namespace std; using namespace atcoder; using ll = long long; using ull = unsigned long long; constexpr ll mod = 998244353; int n,a[5000]; int bipartite_matching(int N, int M, const std::vector>& edges) { int node_count = N + M + 2; int S = 0; int T = N + M + 1; mf_graph g(node_count); for (int i = 0; i < N; ++i) { g.add_edge(S, 1 + i, 1); } for (int j = 0; j < M; ++j) { g.add_edge(1 + N + j, T, 1); } for (const auto& edge : edges) { int u = edge.first; int v = edge.second; g.add_edge(1 + u, 1 + N + v, 1); } return g.flow(S, T); } int main() { int n; cin >> n; vector a(n); for (int i = 0; i < n; i++) cin >> a[i]; vector> edges; int l = 1,r = n + 1; while(r - l > 1){ int mid = (l + r) / 2; vector> tmp; for (int i = 0; i < mid; i++) { for (int j = 0; j < n; j++) { if (a[j] % (i + 1) == 0) { tmp.push_back({i, j}); } } } int flow = bipartite_matching(mid, n, tmp); if(flow == mid) l = mid; else r = mid; } cout << l << endl; }