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

/* ---------- STL Libraries ---------- */
// IO library
#include <cstdio>

#include <fstream>
#include <iomanip>
#include <ios>
#include <iostream>

// algorithm library
#include <algorithm>

#include <cassert>
#include <cmath>
#include <cstring>
#include <numeric>
#include <random>

// container library
#include <array>
#include <bitset>
#include <deque>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <tuple>
#include <unordered_map>
#include <vector>

// type
#include <cstdint>
#include <functional>

/* ---------- Namespace ---------- */
using namespace std;

/* ---------- Type ---------- */
using ll = long long;
#define int ll
template <class T> using MaxHeap = priority_queue<T>;
template <class T> using MinHeap = priority_queue<T, vector<T>, greater<T>>;
#define P pair<ll, ll>

/* ---------- Constants  */
const double PI = 3.141592653589793238462643383279;
const ll MOD = 1e9 + 7;
const int INF = 1LL << 55;

/* ---------- Functions */
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}

#define MAXR 1000005

// 以下、MAXR(=10^5)です。詳しくはテンプレートを参照してください。
#define PN 1 // 素数のマークは1

// MAXRまでの整数は素数であると仮定する
vector<ll> PN_chk(MAXR + 1, PN); // 0indexでi番目が整数iに対応(0~MAXR)

// 素因数分解結果に含まれるそれぞれの素数の個数を保存するmap
map<ll, ll> prime;

// O(MAXR)
void se() {
  ll MAXRR = sqrt(MAXR) + 1;
  // 2以上の数の素因数分解をするので無視して良い
  PN_chk[0] = 0;
  PN_chk[1] = 0;
  for (int i = 2; i < MAXRR; i++) {
    // たどり着いた時に素数と仮定されているなら素数
    // ある素数の倍数はその素数で割り切れるのでマークづけ
    if (PN_chk[i] == 1)
      for (int j = i; j < ll(MAXR / i); j++) {
        PN_chk[j * i] = i;
      }
  }
}

// O(logn)
// mapなのでprimeは整列されている！！！
void prime_factorize(ll n) {
  if (n <= 1)
    return;
  // 1の場合はnは素数
  if (PN_chk[n] == 1) {
    prime[n] += 1;
    return;
  }
  // マークされている数は素数
  prime[PN_chk[n]] += 1;
  // マークされている数でnを割った数を考える
  prime_factorize(ll(n / PN_chk[n]));
}

/* v-v-v-v-v-v-v-v-v Main Part v-v-v-v-v-v-v-v-v */
signed main() {
  cin.sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);

  int N;
  cin >> N;
  vector<int> A(N);
  for (int i = 0; i < N; i++)
    cin >> A[i];
  se();

  map<int, int> m;
  for (int i = 0; i < N; i++) {
    prime.clear();
    prime_factorize(A[i]);
    for (auto it = prime.begin(); it != prime.end(); it++) {
      m[it->first]++;
    }
  }

  bool is_pair = true;
  bool is_set = true;
  for (auto it = m.begin(); it != m.end(); it++) {
    if (it->second >= 2)
      is_pair = false;
    if (it->second == N)
      is_set = false;
  }

  if (is_pair) {
    cout << "pairwise coprime" << endl;
  } else if (is_set) {
    cout << "setwise coprime" << endl;
  } else {
    cout << "not coprime" << endl;
  }

  return 0;
}

Error: TLE

Fixed submission:

/* ---------- STL Libraries ---------- */
// IO library
#include <cstdio>

#include <fstream>
#include <iomanip>
#include <ios>
#include <iostream>

// algorithm library
#include <algorithm>

#include <cassert>
#include <cmath>
#include <cstring>
#include <numeric>
#include <random>

// container library
#include <array>
#include <bitset>
#include <deque>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <tuple>
#include <unordered_map>
#include <vector>

// type
#include <cstdint>
#include <functional>

/* ---------- Namespace ---------- */
using namespace std;

/* ---------- Type ---------- */
using ll = long long;
#define int ll
template <class T> using MaxHeap = priority_queue<T>;
template <class T> using MinHeap = priority_queue<T, vector<T>, greater<T>>;
#define P pair<ll, ll>

/* ---------- Constants  */
const double PI = 3.141592653589793238462643383279;
const ll MOD = 1e9 + 7;
const int INF = 1LL << 55;

/* ---------- Functions */
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}

int gcd(int a, int b) {
  if (b == 0)
    return a;
  return gcd(b, a % b);
}
map<int, int> prime_factor(int n) {
  map<int, int> ret;
  for (int i = 2; i * i <= n; i++) {
    while (n % i == 0) {
      ret[i]++;
      n /= i;
    }
  }

  if (n != 1)
    ret[n] = 1;
  return move(ret);
};

/* v-v-v-v-v-v-v-v-v Main Part v-v-v-v-v-v-v-v-v */
signed main() {
  cin.sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);

  int N;
  cin >> N;
  vector<int> A(N);
  for (int i = 0; i < N; i++)
    cin >> A[i];

  map<int, int> m;
  bool is_pairwise = true;
  for (int i = 0; i < N; i++) {
    auto pf = prime_factor(A[i]);
    for (auto it = pf.begin(); it != pf.end(); it++) {
      m[it->first]++;
      if (m[it->first] >= 2)
        is_pairwise = false;
    }
  }

  int mx = 0;
  for (auto it = m.begin(); it != m.end(); it++) {
    mx = max(mx, it->second);
  }

  if (is_pairwise) {
    cout << "pairwise coprime" << endl;
    return 0;
  }

  if (mx < N) {
    cout << "setwise coprime" << endl;
    return 0;
  }

  cout << "not coprime" << endl;

  return 0;
}