#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;
}
