Problem p02574 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>

#ifndef M_PI
#define M_PI 3.14159265358979
#endif
#define deg_to_rad(deg) (((deg) / 360) * 2 * M_PI)
#define rad_to_deg(rad) (((rad) / 2 / M_PI) * 360)

using namespace std;

typedef long long ll;
typedef vector<ll> vll;
typedef vector<int> vi;
typedef pair<ll, ll> pll;
typedef pair<int, int> pi;
typedef long double ld;
typedef pair<long double, long double> pld;

const ll INF = 1e18;
const ll MOD = 1e9 + 7;

ll gcd(ll n, ll m) {
  if (n > m) {
    ll l = n;
    n = m;
    m = l;
  }
  if (n == 0) {
    return m;
  }
  while (1) {
    ll l = n;
    n = m % n;
    m = l;
    if (n == 0) {
      break;
    }
  }
  return m;
}

bool isprime(ll n) {
  if (n == 1) {
    return false;
  }
  if (n == 2) {
    return true;
  }
  ll sq = (ll)sqrt(double(n));
  for (ll i = 2; i <= sq; i++) {
    if (n % i == 0) {
      return false;
    }
  }
  return true;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  ll i, j, k, l;

  ll N;
  cin >> N;
  vll A(N);
  for (auto &e : A)
    cin >> e;
  // setwise
  ll g = A[0];
  for (i = 1; i < N; i++) {
    g = gcd(g, A[i]);
  }
  if (g > 1) {
    cout << "not coprime" << endl;
    return 0;
  }
  // pairwise
  for (i = 2; i <= 1010; i++) {
    if (!isprime(i)) {
      continue;
    }
    ll count = 0;
    for (j = 0; j < N; j++) {
      if (A[j] % i == 0) {
        count++;
        A[j] = A[j] / i;
      }
    }
    if (count >= 2) {
      cout << "setwise coprime" << endl;
      return 0;
    }
  }
  set<ll> pset;
  for (i = 0; i < N; i++) {
    if (A[i] > 1000 && isprime(A[i])) {
      auto itr = pset.find(A[i]);
      if (itr != pset.end()) {
        cout << "setwise coprime" << endl;
        return 0;
      }
      pset.insert(A[i]);
    }
  }
  cout << "pairwise coprime" << endl;

  return 0;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>

#ifndef M_PI
#define M_PI 3.14159265358979
#endif
#define deg_to_rad(deg) (((deg) / 360) * 2 * M_PI)
#define rad_to_deg(rad) (((rad) / 2 / M_PI) * 360)

using namespace std;

typedef long long ll;
typedef vector<ll> vll;
typedef vector<int> vi;
typedef pair<ll, ll> pll;
typedef pair<int, int> pi;
typedef long double ld;
typedef pair<long double, long double> pld;

const ll INF = 1e18;
const ll MOD = 1e9 + 7;

ll gcd(ll n, ll m) {
  if (n > m) {
    ll l = n;
    n = m;
    m = l;
  }
  if (n == 0) {
    return m;
  }
  while (1) {
    ll l = n;
    n = m % n;
    m = l;
    if (n == 0) {
      break;
    }
  }
  return m;
}

bool isprime(ll n) {
  if (n == 1) {
    return false;
  }
  if (n == 2) {
    return true;
  }
  ll sq = (ll)sqrt(double(n));
  for (ll i = 2; i <= sq; i++) {
    if (n % i == 0) {
      return false;
    }
  }
  return true;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  ll i, j, k, l;

  ll N;
  cin >> N;
  vll A(N);
  for (auto &e : A)
    cin >> e;
  // setwise
  ll g = A[0];
  for (i = 1; i < N; i++) {
    g = gcd(g, A[i]);
  }
  if (g > 1) {
    cout << "not coprime" << endl;
    return 0;
  }
  // pairwise
  for (i = 2; i <= 1000000; i++) {
    if (!isprime(i)) {
      continue;
    }
    ll count = 0;
    for (j = 0; j < N; j++) {
      if (A[j] % i == 0) {
        count++;
      }
    }
    if (count >= 2) {
      cout << "setwise coprime" << endl;
      return 0;
    }
  }
  cout << "pairwise coprime" << endl;

  return 0;
}