#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using namespace std;
using ll = long long;
template <typename T = ll>
using v = vector<T>;
template <typename T = ll>
using vv = v<v<T>>;
template <typename T = ll, typename U = ll>
using p = pair<T, U>;
template <typename T>
T chmin(T& a, T b) {
  return a = min(a, b);
}
template <typename T>
T chmax(T& a, T b) {
  return a = max(a, b);
}
const ll INF = (ll)1e9;
template <int MOD>
struct ModInt {
  using lint = long long;
  int val;
  ModInt(lint v = 0) : val(v % MOD) {
    if (val < 0) val += MOD;
  };
  ModInt operator+() const { return ModInt(val); }
  ModInt operator-() const { return ModInt(MOD - val); }
  ModInt inv() const { return this->pow(MOD - 2); }
  ModInt operator+(const ModInt& x) const { return ModInt(*this) += x; }
  ModInt operator-(const ModInt& x) const { return ModInt(*this) -= x; }
  ModInt operator*(const ModInt& x) const { return ModInt(*this) *= x; }
  ModInt operator/(const ModInt& x) const { return ModInt(*this) /= x; }
  ModInt pow(lint n) const {
    auto x = ModInt(1);
    auto b = *this;
    while (n > 0) {
      if (n & 1) x *= b;
      n >>= 1;
      b *= b;
    }
    return x;
  }
  ModInt& operator+=(const ModInt& x) {
    if ((val += x.val) >= MOD) val -= MOD;
    return *this;
  }
  ModInt& operator-=(const ModInt& x) {
    if ((val -= x.val) < 0) val += MOD;
    return *this;
  }
  ModInt& operator*=(const ModInt& x) {
    val = lint(val) * x.val % MOD;
    return *this;
  }
  ModInt& operator/=(const ModInt& x) { return *this *= x.inv(); }
  bool operator==(const ModInt& b) const { return val == b.val; }
  bool operator!=(const ModInt& b) const { return val != b.val; }
  friend std::istream& operator>>(std::istream& is, ModInt& x) noexcept {
    return is >> x.val;
  }
  friend std::ostream& operator<<(std::ostream& os, const ModInt& x) noexcept {
    return os << x.val;
  }
};
constexpr int MOD = 1e9 + 7;
using mint = ModInt<MOD>;
void a() {
  ll D, T, S;
  cin >> D >> T >> S;
  if (D <= T * S) {
    cout << "Yes" << endl;
  } else {
    cout << "No" << endl;
  }
}
void b() {
  string S, T;
  cin >> S >> T;
  ll ans = 0;
  for (ll i = 0; i < S.size() - T.size() + 1; i++) {
    ll cnt = 0;
    for (ll j = 0; j < T.size(); j++) {
      if (S[i + j] == T[j]) cnt++;
    }
    chmax(ans, cnt);
  }
  cout << T.size() - ans << endl;
}
void c() {
  ll N;
  cin >> N;
  auto A = v<mint>(N, 0);
  for (ll i = 0; i < (N); i++) cin >> A[i];
  mint ans = 0;
  mint sum = 0;
  for (ll i = 0; i < (N); i++) sum += A[i];
  for (ll i = N - 1; i >= 0; i--) {
    ans += (sum - A[i]) * A[i];
  }
  cout << ans / 2 << endl;
}
struct UnionFind {
  vector<int> par;
  vector<int> rank;
  UnionFind(int N) : par(N), rank(N) {
    for (int i = 0; i < N; i++) {
      par[i] = i;
      rank[i] = 0;
    }
  }
  int root(int x) {
    if (par[x] == x) return x;
    return par[x] = root(par[x]);
  }
  void unite(int x, int y) {
    int rx = root(x);
    int ry = root(y);
    if (rx == ry) return;
    if (rank[rx] < rank[ry]) {
      par[rx] = ry;
    } else {
      par[ry] = rx;
      if (rank[rx] == rank[ry]) rank[rx]++;
    }
  }
  bool same(int x, int y) {
    int rx = root(x);
    int ry = root(y);
    return rx == ry;
  }
};
class d {
 public:
  d() {
    ll N, M;
    cin >> N >> M;
    UnionFind tree(N);
    for (ll i = 0; i < (M); i++) {
      ll A, B;
      cin >> A >> B;
      tree.unite(A - 1, B - 1);
    }
    ll ans = 0;
    map<ll, ll> sum;
    for (ll i = 0; i < (N); i++) {
      tree.root(i);
      sum[tree.par[i]]++;
    }
    for (auto i : sum) {
      chmax(ans, i.second);
    }
    cout << ans << endl;
  }
};
ll gcd(ll a, ll b) { return (b == 0 ? a : gcd(b, a % b)); }
void e() {
  ll N;
  cin >> N;
  v<> A(N, 0);
  for (ll i = 0; i < (N); i++) cin >> A[i];
  sort(A.begin(), A.end());
  ll seed = A[0];
  for (ll i = 1; i < N; i++) {
    seed = gcd(seed, A[i]);
  }
  if (seed != 1) {
    cout << "not coprime" << endl;
    return;
  }
  UnionFind tree(1000001);
  ll MA = *max_element(A.begin(), A.end());
  for (ll i = 2; i <= MA; i += (i % 2 == 0 ? 1 : 2)) {
    for (ll j = i; j <= MA; j += i) {
      tree.unite(i, j);
    }
  }
  map<ll, ll> M;
  for (ll i = 0; i < (N); i++) {
    M[tree.par[A[i]]]++;
  }
  for (auto i : M) {
    if (i.second > 1) {
      cout << "setwise coprime" << endl;
      return;
    }
  }
  cout << "pairwise coprime" << endl;
}
void f() {}
int main(void) {
  e();
  return 0;
}
