#include using namespace std; #include #define rep(i, l, r) for (int i = (int)(l); i<(int)(r); i++) #define ll long long #define ld long double #define all(x) (x).begin(), (x).end() #define siz(x) (int)(x).size() const int inf = 1e9; const ll INF = 4e18; templatebool chmax(T &a, T b) { if (abool chmin(T &a, T b) { if (b di = {-1, 0, 1, 0}, dj = {0, -1, 0, 1}; template using pq = priority_queue, less>; template using spq = priority_queue, greater>; void solve() { int N; cin >> N; vector A(N); for (int i = 0; i < N; i++) cin >> A[i]; sort(A.begin(), A.end()); int M = 5000; auto isok = [&](int m) -> bool { atcoder::mf_graph G(m + N + 2); int s = m + N, t = m + N + 1; for (int i = 1; i <= m; i++) { G.add_edge(s, i - 1, 1); } for (int j = 0; j < N; j++) { G.add_edge(j + m, t, 1); } for (int i = 1; i <= m; i++) { for (int j = i; j <= M; j += i) { int l = lower_bound(A.begin(), A.end(), j) - A.begin(); int r = upper_bound(A.begin(), A.end(), j) - A.begin(); for (int k = l; k < r; k++) { G.add_edge(i - 1, k + m, 1); } } } if (G.flow(s, t) == m) return true; return false; }; int ok = 0, ng = N+1; while(ng - ok > 1) { int mid = (ok + ng) / 2; if (isok(mid)) ok = mid; else ng = mid; } cout << ok << endl; } int main() { cin.tie(nullptr); ios::sync_with_stdio(false); cout << fixed << setprecision(15); cerr << fixed << setprecision(15); int T = 1; // cin >> T; while(T--) { solve(); } }