#include <bits/stdc++.h>   using namespace std;   inline char get(void) {     static char buf[100000], *S = buf, *T = buf;     if (S == T) {       T = (S = buf) + fread(buf, 1, 100000, stdin);       if (T == S) return EOF;     }     return *S++;   }   inline void read(int& x) {     static char c;     x = 0;     for (c = get(); c <  0  || c >  9 ; c = get())       ;     for (; c >=  0  && c <=  9 ; c = get()) x = x * 10 + c -  0 ;   }   const int M = 500 * 1000 + 10;   const int up = 300000 + 10;   const int mod = 998244353;   int n;   int cnt[M] = {0};   bool vs[M] = {0};   int dp[M] = {0};   int fac[100];   int tp;   int num[100];   int C[8][M] = {0};   void init() {     C[0][0] = 1;     for (int i = 1; i < up; ++i) {       C[0][i] = 1;       for (int j = 1; j < 8; ++j) C[j][i] = (C[j - 1][i - 1] + C[j][i - 1]) % mod;     }   }   void dfs(int c, int al) {     if (c == tp) {       ++cnt[al];       return;     }     for (int i = 0; i < num[c] + 1; ++i) {       dfs(c + 1, al);       al *= fac[c];     }   }   void add(int a) {     tp = 0;     for (int i = 2; i * i <= a; ++i) {       if (0 == a % i) {         fac[tp] = i;         num[tp] = 0;         while (a % i == 0) ++num[tp], a /= i;         ++tp;       }     }     if (1 != a) {       fac[tp] = a;       num[tp++] = 1;     }     dfs(0, 1);   }   bool solve(int x) {     for (int t = up; t; --t) {       dp[t] = C[x][cnt[t]];       for (int i = 2; i * t < up; ++i) dp[t] = (dp[t] - dp[i * t] + mod) % mod;     }     return dp[1] > 0;   }   int main() {     ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);     init();     cin >> n;     int a;     for (int i = 0; i < n; ++i) {       cin >> a;       if (vs[a]) continue;       vs[a] = 1;       add(a);     }     bool fg = 1;     if (vs[1]) {       fg = 0;       cout << 1 << endl;     }     for (int i = 2; i < 8; ++i) {       if (!fg) break;       if (solve(i)) {         fg = 0;         cout << i << endl;         break;       }     }     if (fg) cout << -1 << endl;     return 0;   }   