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

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

// マクロ
// forループ関係
// 引数は、(ループ内変数,動く範囲)か(ループ内変数,始めの数,終わりの数)、のどちらか
// Dがついてないものはループ変数は1ずつインクリメントされ、Dがついてるものはループ変数は1ずつデクリメントされる
#define REP(i, n) for (ll i = 0; i < ll(n); i++)
#define REPD(i, n) for (ll i = n - 1; i >= 0; i--)
#define FOR(i, a, b) for (ll i = a; i <= ll(b); i++)
#define FORD(i, a, b) for (ll i = a; i >= ll(b); i--)
// xにはvectorなどのコンテナ
#define ALL(x) x.begin(), x.end() // sortなどの引数を省略したい
#define SIZE(x) ll(x.size())      // sizeをsize_tからllに直しておく
#define LEN(x) ll(x.length())     // lengthをsize_tからllに直しておく
// 定数
#define INF 1000000000000 // 10^12:極めて大きい値,∞
#define MOD 1000000007    // 10^9+7:合同式の法
#define MAXR 100000 // 10^5:配列の最大のrange(素数列挙などで使用)
// 略記
#define PB emplace_back // vectorヘの挿入
#define MP make_pair    // pairのコンストラクタ
#define F first         // pairの一つ目の要素
#define S second        // pairの二つ目の要素
#define Umap unordered_map
#define Uset unordered_set

vector<ll> min_eratosthenes(ll n) {
  vector<ll> min_prime(n + 1, -1);
  min_prime[0] = 0;
  min_prime[1] = 1;
  for (ll i = 2; i * i <= n; i++) {
    if (min_prime[i] == -1) {
      for (ll j = 1; i * j <= n; j++)
        min_prime[i * j] = i;
    }
  }
  for (ll i = 0; i <= n; i++) {
    if (min_prime[i] == -1)
      min_prime[i] = i;
  }
  return min_prime;
}

int main() {
  ll n;
  cin >> n;
  vector<ll> a(n);
  REP(i, n) cin >> a[i];
  ll max_a = 0;
  REP(i, n) max_a = max(max_a, a[i]);
  vector<ll> min_prime = min_eratosthenes(max_a);
  vector<ll> num(max_a + 1, 0);
  REP(i, n) {
    set<ll> st;
    while (a[i] != 1) {
      st.insert(min_prime[a[i]]);
      a[i] /= min_prime[a[i]];
    }
    for (auto x : st) {
      num[x]++;
    }
  }
  ll ans = 0;
  REP(i, max_a + 1) ans = max(ans, num[i]);
  if (ans <= 1)
    cout << "pairwise coprime";
  else if (ans == n)
    cout << "not coprime";
  else
    cout << "setwise coprime";
  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

// マクロ
// forループ関係
// 引数は、(ループ内変数,動く範囲)か(ループ内変数,始めの数,終わりの数)、のどちらか
// Dがついてないものはループ変数は1ずつインクリメントされ、Dがついてるものはループ変数は1ずつデクリメントされる
#define REP(i, n) for (ll i = 0; i < ll(n); i++)
#define REPD(i, n) for (ll i = n - 1; i >= 0; i--)
#define FOR(i, a, b) for (ll i = a; i <= ll(b); i++)
#define FORD(i, a, b) for (ll i = a; i >= ll(b); i--)
// xにはvectorなどのコンテナ
#define ALL(x) x.begin(), x.end() // sortなどの引数を省略したい
#define SIZE(x) ll(x.size())      // sizeをsize_tからllに直しておく
#define LEN(x) ll(x.length())     // lengthをsize_tからllに直しておく
// 定数
#define INF 1000000000000 // 10^12:極めて大きい値,∞
#define MOD 1000000007    // 10^9+7:合同式の法
#define MAXR 100000 // 10^5:配列の最大のrange(素数列挙などで使用)
// 略記
#define PB emplace_back // vectorヘの挿入
#define MP make_pair    // pairのコンストラクタ
#define F first         // pairの一つ目の要素
#define S second        // pairの二つ目の要素
#define Umap unordered_map
#define Uset unordered_set

vector<bool> IsPrime;
void sieve(size_t max) {
  if (max + 1 > IsPrime.size()) {  // resizeで要素数が減らないように
    IsPrime.resize(max + 1, true); // IsPrimeに必要な要素数を確保
  }
  IsPrime[0] = false; // 0は素数ではない
  IsPrime[1] = false; // 1は素数ではない

  for (size_t i = 2; i * i <= max; ++i)     // 0からsqrt(max)まで調べる
    if (IsPrime[i])                         // iが素数ならば
      for (size_t j = 2; i * j <= max; ++j) // (max以下の)iの倍数は
        IsPrime[i * j] = false;             // 素数ではない
}

int main() {
  ll n;
  cin >> n;
  vector<ll> a(n);
  REP(i, n) cin >> a[i];
  vector<ll> prime;
  sieve(1000000);
  REP(i, SIZE(IsPrime)) {
    if (IsPrime[i] == true)
      prime.PB(i);
  }
  ll ans = 0;
  REP(i, SIZE(prime)) {
    ll cnt = 0;
    REP(j, SIZE(a)) {
      if (a[j] % prime[i] == 0)
        cnt++;
    }
    ans = max(ans, cnt);
  }
  if (ans == 1)
    cout << "pairwise coprime";
  else if (ans == n)
    cout << "not coprime";
  else
    cout << "setwise coprime";
  return 0;
}