#include <bits/stdc++.h>
using std::cin;
using std::cout;
using std::string;
using std::vector;
static const int MOD = 1000000000 + 7;
static long long gcd(long long x, long long y) {
  return (!y) ? x : gcd(y, x % y);
}
static const int N = 300000 + 8;
int read_int() {
  int x = 0, c = 0;
  c = getchar();
  while (c <= 32) c = getchar();
  while (c >= '0' && c <= '9') {
    x = x * 10 + c - '0';
    c = getchar();
  }
  return x;
}
int n;
int myu[N], a[N], prime[N], has[N], c[N];
int solve() {
  n = read_int();
  for (int i = 0; i < n; ++i) {
    a[i] = read_int();
    has[a[i]] = 1;
  }
  for (int i = 0; i < n; ++i) {
    if (a[i] == 1) {
      puts("1");
      return 0;
    }
  }
  int g = 0;
  for (int i = 0; i < n; ++i) {
    g = gcd(a[i], g);
  }
  if (g != 1) {
    puts("-1");
    return 0;
  }
  for (int i = 0; i < N; ++i) myu[i] = 1, prime[i] = 1;
  myu[0] = 0;
  myu[1] = 1;
  for (int i = 2; i * i < N; ++i) {
    if (prime[i]) {
      int ii = i * i;
      for (int j = ii; j < N; j += ii) myu[j] = 0;
      for (int j = ii; j < N; j += i) prime[j] = 0;
    }
  }
  for (int i = 2; i < N; ++i) {
    if (prime[i]) {
      for (int j = i; j < N; j += i) myu[j] = -myu[j];
    }
  }
  for (int i = 1; i < N; ++i) {
    for (int j = i * 2; j < N; j += i) has[i] += has[j];
  }
  for (int i = 1; i < N; ++i) c[i] = i;
  for (int ans = 2;; ++ans) {
    int now = 0;
    for (int i = 1, prev_c = 0; i < N; ++i) {
      int curr_c = c[i];
      c[i] = (c[i - 1] + prev_c);
      if (c[i] >= MOD) c[i] -= MOD;
      prev_c = curr_c;
    }
    for (int i = 1; i < N; ++i) {
      now = (now + c[has[i]] * myu[i]) % MOD;
    }
    if (now != 0) {
      printf("%d\n", ans);
      return 0;
    }
  }
  assert(false);
  return 0;
}
int main(int argc, char* argv[]) {
  ::std::ios::sync_with_stdio(false);
  ::std::cin.tie(0);
  ::std::cout.tie(0);
  int test_count = 1;
  while (test_count--) solve();
  return 0;
}
