#include #include using namespace std; int main(){ int n; cin >> n; vector a(n); for(int i = 0; i < n; i++)cin >> a[i]; vector> div(n); for(int i = 0; i < n; i++){ for(int x = 1; x * x <= a[i]; x++){ if(a[i] % x != 0)continue; if(x*x != a[i])div[i].push_back(a[i]/x); div[i].push_back(x); } } int ok = 0, ng = n+1; while(ng - ok > 1){ int mid = (ok + ng) / 2; atcoder::mf_graph G(n+mid+2); for(int i = 0; i < mid; i++){ G.add_edge(n+mid, n+i, 1); } for(int i = 0; i < n; i++){ G.add_edge(i, n+mid+1, 1); for(auto x : div[i])if(x <= mid){ G.add_edge(n+x-1, i, 1); } } if(G.flow(n+mid, n+mid+1) == mid)ok = mid; else ng = mid; } cout << ok << endl; }