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

#include <algorithm>
#include <bits/stdc++.h>
#include <cmath>
#include <iterator>
#include <math.h>
#include <utility>
#include <vector>

using namespace std;

typedef long long ll; // %lld
typedef vector<int> vi;
typedef pair<int, int> pi;

#define mod (pow(10, 9) + 7);
#define PB push_back
#define POB pop_back
#define MP make_pair
#define itri std::vector<int>::iterator
#define max(a, b) (a < b ? b : a)
#define min(a, b) ((a > b) ? b : a)

void showpq(vector<ll> gq) {
  vector<ll> g = gq;
  reverse(g.begin(), g.end());
  while (!g.empty()) {
    cout << g.back() << " ";
    g.pop_back();
  }
  cout << '\\n';
}

bool isPrime(ll n) {
  // Corner cases
  if (n <= 1)
    return false;
  if (n <= 3)
    return true;

  // This is checked so that we can skip
  // middle five numbers in below loop
  if (n % 2 == 0 || n % 3 == 0)
    return false;

  for (ll i = 5; i * i <= n; i = i + 6)
    if (n % i == 0 || n % (i + 2) == 0)
      return false;

  return true;
}

// Function to return the smallest
// prime number greater than N
int nextPrime(ll N) {

  // Base case
  if (N <= 1)
    return 2;

  ll prime = N;
  bool found = false;

  // Loop continuously until isPrime returns
  // true for a number greater than n
  while (!found) {
    prime++;

    if (isPrime(prime))
      found = true;
  }

  return prime;
}

int main() {
#ifndef ONLINE_JUDGE
  freopen("inno.in", "r", stdin);
  freopen("ottu.txt", "w", stdout);
#endif

  ll n, pri, c = 1, m, cnt = 0, p;
  cin >> n;
  vector<ll> promo;

  pri = 2;
  p = pow(pri, c);

  if (isPrime(n)) {
    cnt = 1;
  } else {
    while (pri <= n) {
      if (n % p == 0) {
        promo.PB(p);
        n = (n / p);
        cnt += 1;
        if (isPrime(n)) {
          if (count(promo.begin(), promo.end(), n) == 0) {
            cnt += 1;
          }
          break;
        }
        c += 1;
        p = pow(pri, c);
        continue;
      } else {
        pri = nextPrime(pri);
        c = 1;
        p = pow(pri, c);
      }
    }
  }

  cout << cnt << endl;

  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <bits/stdc++.h>
#include <cmath>
#include <iterator>
#include <math.h>
#include <utility>
#include <vector>

using namespace std;

typedef long long ll; // %lld
typedef vector<int> vi;
typedef pair<int, int> pi;

#define mod (pow(10, 9) + 7);
#define PB push_back
#define POB pop_back
#define MP make_pair
#define itri std::vector<int>::iterator
#define max(a, b) (a < b ? b : a)
#define min(a, b) ((a > b) ? b : a)

void showpq(vector<ll> gq) {
  vector<ll> g = gq;
  reverse(g.begin(), g.end());
  while (!g.empty()) {
    cout << g.back() << " ";
    g.pop_back();
  }
  cout << '\\n';
}

bool isPrime(ll n) {
  // Corner cases
  if (n <= 1)
    return false;
  if (n <= 3)
    return true;

  // This is checked so that we can skip
  // middle five numbers in below loop
  if (n % 2 == 0 || n % 3 == 0)
    return false;

  for (ll i = 5; i * i <= n; i = i + 6)
    if (n % i == 0 || n % (i + 2) == 0)
      return false;

  return true;
}

// Function to return the smallest
// prime number greater than N
int nextPrime(ll N) {

  // Base case
  if (N <= 1)
    return 2;

  ll prime = N;
  bool found = false;

  // Loop continuously until isPrime returns
  // true for a number greater than n
  while (!found) {
    prime++;

    if (isPrime(prime))
      found = true;
  }

  return prime;
}

int main() {
#ifndef ONLINE_JUDGE
  freopen("inno.in", "r", stdin);
  freopen("ottu.txt", "w", stdout);
#endif

  ll n, pri, c = 1, m, cnt = 0, p;
  cin >> n;
  m = mod;

  pri = 2;
  p = pow(pri, c);

  if (isPrime(n)) {
    cnt = 1;
  } else {
    while (pri <= n) {
      if (n % p == 0) {
        n = (n / p);
        cnt += 1;
        c += 1;
        p = pow(pri, c);
        continue;
      } else {
        pri = nextPrime(pri);
        c = 1;
        p = pow(pri, c);
      }
    }
  }

  cout << cnt << endl;

  return 0;
}