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

#include <bits/stdc++.h>
using namespace std;

template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
using ll = long long;
using pint = pair<int, int>;
using pll = pair<ll, ll>;
using vint = vector<int>;
using vll = vector<ll>;
using vstr = vector<string>;

// 　定数, 変数 *********************************************
const ll MOD = 1e9 + 7;
const ll INF = 1ll << 60;

ll N;

map<int, int> mp;
vector<pair<ll, ll>> fs;
//***********************************************************
void dp(int n) {
  // 割る数の初期値
  int a = 2;
  // √n ≧ a ( n ≧ a * a ) の間ループ処理
  while (n >= a * a) {
    // a で割り切れたら、a は素因数
    // そして、割られる数を a で割る
    // a で割り切れなかったら、 a を 1 増加させる
    if (n % a == 0) {
      // printf("%d * ", a);
      ++mp[a];
      n /= a;
    } else {
      ++a;
    }
  }
  // 最後に残った n は素因数
  // printf("%d\\n", n);
  ++mp[n];
}

// *********************************************************

void dp2(ll n) {
  for (ll i = 2; i * i <= n; ++i) {
    int x = 0;
    while (n % i == 0) {
      n /= i;
      ++x;
    }
    if (x != 0) {
      fs.emplace_back(i, x);
    }
  }
  if (n != 1) {
    fs.emplace_back(n, 1);
  }
}
// *****************************************************

int main() {
  int sum = 0;
  cin >> N;

  if (N == 1) {
    cout << 0 << endl;
    return 0;
  }

  dp2(N);
  for (auto p : fs) {
    // cout << p.first << " " << p.second << endl;
    int x = p.second;
    int b = 1;
    while (b <= x) {
      x -= b;
      ++b;
      ++sum;
    }
  }

  cout << sum << endl;

  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;

template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
using ll = long long;
using pint = pair<int, int>;
using pll = pair<ll, ll>;
using vint = vector<int>;
using vll = vector<ll>;
using vstr = vector<string>;

// 　定数, 変数 *********************************************
const ll MOD = 1e9 + 7;
const ll INF = 1ll << 60;

int N;

map<int, int> mp;
//***********************************************************
void dp(int n) {
  // 割る数の初期値
  int a = 2;
  // √n ≧ a ( n ≧ a * a ) の間ループ処理
  while (n >= a * a) {
    // a で割り切れたら、a は素因数
    // そして、割られる数を a で割る
    // a で割り切れなかったら、 a を 1 増加させる
    if (n % a == 0) {
      // printf("%d * ", a);
      mp[a]++;
      n /= a;
    } else {
      a++;
    }
  }
  // 最後に残った n は素因数
  // printf("%d\\n", n);
  mp[n]++;
}

// *********************************************************
int main() {

  cin >> N;

  if (N == 1) {
    cout << 0 << endl;
    return 0;
  }

  dp(N);

  int sum = 0;

  for (auto i = mp.begin(); i != mp.end(); ++i) {
    int x = i->second;
    int b = 1;
    while (b <= x) {
      x -= b;
      ++b;
      ++sum;
    }
  }

  cout << sum << endl;

  return 0;
}