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

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

using ll = long long;
using ld = long double;
using vi = vector<int>;
using vvi = vector<vector<int>>;
using vvvi = vector<vector<vector<int>>>;
using vl = vector<ll>;
using vvl = vector<vector<ll>>;
using vvvl = vector<vector<vector<ll>>>;
using vs = vector<string>;
using vb = vector<bool>;
#define FOR(i, m, n) for (int i = (m); i < (n); i++)
#define FORR(i, m, n) for (int i = (m); i >= (n); i--)
#define REP(i, n) FOR(i, 0, (n))
#define REPR(i, n) FORR(i, (n)-1, 0)
#define REP1(i, n) FOR(i, 1, (n) + 1)
#define REPS(c, s) for (char c : s)
#define ALL(c) (c).begin(), (c).end()
#define SORT(c) sort(ALL(c))
#define REV(c) reverse(ALL(c))
#define sz(v) (int)v.size()
#define endl '\\n'
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;
}
template <class T> inline void prn(vector<T> &v) {
  int n = sz(v);
  REP(i, n) cout << v[i] << ' ';
}
template <class T> inline void printv(vector<T> &v) {
  int n = sz(v);
  REP(i, n) cout << v[i] << (i == n - 1 ? endl : ' ');
}
template <class T> inline void printvv(vector<vector<T>> &v) {
  for (auto u : v)
    printv(u);
}
template <class T> inline void printlnv(vector<T> &v) {
  int n = sz(v);
  REP(i, n) cout << v[i] << endl;
}
const int MOD = 1000000007;
const int INF = 1000000001;
const ll LINF = 1000000001000000001LL;

void solve();

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout << fixed << setprecision(numeric_limits<double>::max_digits10);
  solve();
  return 0;
}

vector<ll> divisors(ll n) {
  vector<ll> v;
  for (ll i = 1; i * i <= n; i++) {
    if (n % i == 0) {
      v.push_back(i);
      if (i * i != n) {
        v.push_back(n / i);
      }
    }
  }
  return v;
}

map<ll, ll> prime_factorization(ll n) {
  map<ll, ll> m;
  ll x = n;
  ll d = 2;
  while (x > 1 && d * d <= n) {
    if (x % d == 0) {
      m[d]++;
      x /= d;
    } else {
      d++;
    }
  }
  if (x != 1)
    m[x]++;
  return m;
}

void solve() {
  int n;
  cin >> n;
  int ans = 0;
  vector<map<ll, ll>> memo(n + 1);
  for (int c = n - 1; c > 0; c--) {
    int x = n - c;
    if (x % 2 == 0) {
      auto z = memo[x / 2];
      z[2]++;
      memo[x] = z;
    } else if (x % 3 == 0) {
      auto z = memo[x / 3];
      z[3]++;
      memo[x] = z;
    } else if (x % 5 == 0) {
      auto z = memo[x / 5];
      z[5]++;
      memo[x] = z;
    } else if (x % 7 == 0) {
      auto z = memo[x / 7];
      z[7]++;
      memo[x] = z;
    } else {
      auto d = prime_factorization(x);
      memo[x] = d;
    }
    if (x == 1)
      ans++;
    else {
      int s = 1;
      for (auto t : memo[x])
        s *= t.second + 1;
      ans += s;
    }
  }
  cout << ans << endl;
}

Error: TLE

Fixed submission:

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

using ll = long long;
using ld = long double;
using vi = vector<int>;
using vvi = vector<vector<int>>;
using vvvi = vector<vector<vector<int>>>;
using vl = vector<ll>;
using vvl = vector<vector<ll>>;
using vvvl = vector<vector<vector<ll>>>;
using vs = vector<string>;
using vb = vector<bool>;
#define FOR(i, m, n) for (int i = (m); i < (n); i++)
#define FORR(i, m, n) for (int i = (m); i >= (n); i--)
#define REP(i, n) FOR(i, 0, (n))
#define REPR(i, n) FORR(i, (n)-1, 0)
#define REP1(i, n) FOR(i, 1, (n) + 1)
#define REPS(c, s) for (char c : s)
#define ALL(c) (c).begin(), (c).end()
#define SORT(c) sort(ALL(c))
#define REV(c) reverse(ALL(c))
#define sz(v) (int)v.size()
#define endl '\\n'
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;
}
template <class T> inline void prn(vector<T> &v) {
  int n = sz(v);
  REP(i, n) cout << v[i] << ' ';
}
template <class T> inline void printv(vector<T> &v) {
  int n = sz(v);
  REP(i, n) cout << v[i] << (i == n - 1 ? endl : ' ');
}
template <class T> inline void printvv(vector<vector<T>> &v) {
  for (auto u : v)
    printv(u);
}
template <class T> inline void printlnv(vector<T> &v) {
  int n = sz(v);
  REP(i, n) cout << v[i] << endl;
}
const int MOD = 1000000007;
const int INF = 1000000001;
const ll LINF = 1000000001000000001LL;

void solve();

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout << fixed << setprecision(numeric_limits<double>::max_digits10);
  solve();
  return 0;
}

vector<ll> divisors(ll n) {
  vector<ll> v;
  for (ll i = 1; i * i <= n; i++) {
    if (n % i == 0) {
      v.push_back(i);
      if (i * i != n) {
        v.push_back(n / i);
      }
    }
  }
  return v;
}

map<ll, ll> prime_factorization(ll n) {
  map<ll, ll> m;
  ll x = n;
  ll d = 2;
  while (x > 1 && d * d <= n) {
    if (x % d == 0) {
      m[d]++;
      x /= d;
    } else {
      d++;
    }
  }
  if (x != 1)
    m[x]++;
  return m;
}

void solve() {
  int n;
  cin >> n;
  int ans = 0;
  vector<map<ll, ll>> memo(n + 1);
  for (int c = n - 1; c > 0; c--) {
    int x = n - c;
    if (x % 2 == 0) {
      auto z = memo[x / 2];
      z[2]++;
      memo[x] = z;
    } else if (x % 3 == 0) {
      auto z = memo[x / 3];
      z[3]++;
      memo[x] = z;
    } else {
      auto d = prime_factorization(x);
      memo[x] = d;
    }
    if (x == 1)
      ans++;
    else {
      int s = 1;
      for (auto t : memo[x])
        s *= t.second + 1;
      ans += s;
    }
  }
  cout << ans << endl;
}