from random import* def BipartiteMatching(n,m,E): l=len(E) g=[0]*(n+2+l) shuffle(E) for i in E:g[(i>>20)+2]+=1 s=n+2 for i in range(n+2):g[i]=s=s+g[i] for i in E:g[g[(i>>20)+1]]=i&1048575;g[(i>>20)+1]+=1 _=[-1]*n b=_[:];r=_[:];f=1 l2r=_[:];r2l=[-1]*m while f: f=0;q=[] for v in range(n): if l2r[v]==-1:r[v]=v;q+=v, for v in q: if l2r[r[v]]!=-1:continue p=g[v];P=g[v+1] while p=0:r2l[u]=v;l2r[v],u=u,l2r[v];v=b[v] f=1;break w=r2l[u] if b[w]!=-1:continue b[w]=v;r[w]=r[v];q+=w, if f:b=_[:];r=_[:] return [(v,l2r[v])for v in range(n)if l2r[v]!=-1] n = int(input()) a = list(map(int, input().split())) ok = 0 ng = n + 1 while abs(ng - ok) > 1: mid = (ok + ng) // 2 E = [] N = mid M = n for i in range(1, mid + 1): for j in range(n): if a[j] % i == 0: E.append((i - 1) << 20 | j) bm = BipartiteMatching(N, M, E) # print(mid, bm, E) if len(bm) == mid: ok = mid else: ng = mid print(ok)