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

#include <algorithm>
#include <array>
#include <cassert>    // assert
#include <cmath>      // abs など
#include <functional> // greater など
#include <iostream>
#include <numeric> // accumulate など
#include <queue>
#include <set>
#include <stdexcept>
#include <string>
#include <tuple>
#include <vector>
using namespace std;

#define REP(i, n) for (int i = 0; i < (int)(n); i++)
typedef long long ll;

// #define NDEBUG 1
// debug用出力 https://trap.jp/post/998/
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail> void debug_out(Head H, Tail... T) {
  cerr << H << " ";
  debug_out(T...);
}
#ifdef NDEBUG
#define debug(...)
#else
#define debug(...) debug_out(__VA_ARGS__)
#endif

//////////////// //////////////// //////////////// ////////////////
///////////////////
//////////////// //////////////// //////////////// ////////////////
///////////////////

// constexpr inline ll MOD = 1'000'000'007;
constexpr int LARGE = 1000000LL + 9;
ll n;
ll res = 0;
int bound;
ll p;
array<bool, LARGE> isprimes;

bool isprime(ll m) {
  for (int i = 2; (ll)i * (ll)i <= m; i++) {
    if (m % i == 0) {
      return false;
    }
  }
  return true;
}

// n < p * p なる素因数 p があるか？
void test() {
  ll maxdiv = 1;
  for (int i = 1; (ll)i * (ll)i <= n; i++) {
    if ((ll)i * (ll)i == n) {
      bound = i;
      p = 0;
      return;
    }
    if (n % i == 0) {
      maxdiv = i;
    }
  }
  bound = maxdiv;
  p = n / maxdiv;
  p = (isprime(p) ? p : 0);
}

int main() {
  cin >> n;
  test();
  if (p > 0) {
    res++;
  }

  // 素因数分解する
  REP(i, bound + 1) { isprimes.at(i) = true; }
  for (int i = 2; i < bound + 1; i++) {
    if (isprimes.at(i) == false) {
      continue;
    }
    for (int j = 2; (ll)i * (ll)j < bound + 1; j++) {
      isprimes.at(i * j) = false;
    }
    ll pw = i;
    for (int k = 1; n % pw == 0; k++) {
      res++;
      n = n / pw;
      pw *= i;
    }
  }

  cout << res << endl;

  return 0;
}


Error: TLE

Fixed submission:

#include <algorithm>
#include <array>
#include <cassert>    // assert
#include <cmath>      // abs など
#include <functional> // greater など
#include <iostream>
#include <numeric> // accumulate など
#include <queue>
#include <set>
#include <stdexcept>
#include <string>
#include <tuple>
#include <vector>
using namespace std;

#define REP(i, n) for (int i = 0; i < (int)(n); i++)
typedef long long ll;

// #define NDEBUG 1
// debug用出力 https://trap.jp/post/998/
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail> void debug_out(Head H, Tail... T) {
  cerr << H << " ";
  debug_out(T...);
}
#ifdef NDEBUG
#define debug(...)
#else
#define debug(...) debug_out(__VA_ARGS__)
#endif

//////////////// //////////////// //////////////// ////////////////
///////////////////
//////////////// //////////////// //////////////// ////////////////
///////////////////

// constexpr inline ll MOD = 1'000'000'007;
constexpr int LARGE = 1000000LL + 9;
ll n;
ll res = 0;
int bound;
ll p;
array<bool, LARGE> isprimes;

bool isprime(ll m) {
  for (int i = 2; i * i <= m; i++) {
    if (m % i == 0) {
      return false;
    }
  }
  return true;
}

// n < p * p なる素因数 p があるか？
ll test() {
  ll maxdiv = 1;
  for (int i = 1; (ll)i * (ll)i <= n; i++) {
    if ((ll)i * (ll)i == n) {
      bound = i;
      return 0;
    }
    if (n % i == 0) {
      maxdiv = i;
    }
  }
  ll p = n / maxdiv;
  bound = maxdiv;
  return (isprime(p) ? p : 0);
}

int main() {
  cin >> n;
  p = test();
  if (p > 0) {
    res++;
  }

  // 素因数分解する
  REP(i, bound + 1) { isprimes.at(i) = true; }
  for (int i = 2; i < bound + 1; i++) {
    if (isprimes.at(i) == false) {
      continue;
    }
    for (int j = 2; (ll)i * (ll)j < bound + 1; j++) {
      isprimes.at(i * j) = false;
    }
    ll pw = i;
    for (int k = 1; n % pw == 0; k++) {
      res++;
      n = n / pw;
      pw *= i;
    }
  }

  cout << res << endl;

  return 0;
}