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

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

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ld, ld> pdd;
typedef vector<ll> vll;
typedef vector<ld> vld;
typedef vector<pll> vpl;
typedef vector<vll> vvll;

#define ALL(a) a.begin(), a.end()
#define SZ(a) ((int)a.size())
#define FI first
#define SE second
#define REP(i, n) for (int i = 0; i < ((int)n); i++)
#define REP1(i, n) for (int i = 1; i < ((int)n); i++)
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define PB push_back
#define EB emplace_back
#define MP(a, b) make_pair(a, b)
#define SORT_UNIQUE(c)                                                         \\
  (sort(c.begin(), c.end()),                                                   \\
   c.resize(distance(c.begin(), unique(c.begin(), c.end()))))
#define GET_POS(c, x) (lower_bound(c.begin(), c.end(), x) - c.begin())
#define yes cout << "Yes" << endl
#define YES cout << "YES" << endl
#define no cout << "No" << endl
#define NO cout << "NO" << endl
#define Decimal fixed << setprecision(20)
#define INF 1000000000
#define LLINF 1000000000000000000LL

const int inf = 1e9;
const ll linf = 1LL << 50;
const double eps = 1e-10;
const int MOD = 1e9 + 7;
const int dx[4] = {-1, 0, 1, 0};
const int dy[4] = {0, -1, 0, 1};

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);

  ll n;
  cin >> n;

  vll isprime(n + 1, 1);
  vll p;
  for (ll i = 2; i <= n; i++) {
    if (!isprime[i])
      continue;

    for (ll j = 2; i * j <= n; j++)
      isprime[i * j] = 0;

    p.push_back(i);
  }

  vll table(n + 1, 1);
  for (auto i : p) {
    for (ll j = 1; i * j <= n; j++) {
      ll tmp = j;

      ll cnt = 1;
      while (tmp % i == 0) {
        tmp /= i;
        cnt++;
      }
      table[i * j] *= cnt + 1;
    }
  }

  ll ans = 1;
  for (ll i = 2; i <= n; i++)
    ans += i * table[i];
  cout << ans << endl;
}


Error: TLE

Fixed submission:

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

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ld, ld> pdd;
typedef vector<ll> vll;
typedef vector<ld> vld;
typedef vector<pll> vpl;
typedef vector<vll> vvll;

#define ALL(a) a.begin(), a.end()
#define SZ(a) ((int)a.size())
#define FI first
#define SE second
#define REP(i, n) for (int i = 0; i < ((int)n); i++)
#define REP1(i, n) for (int i = 1; i < ((int)n); i++)
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define PB push_back
#define EB emplace_back
#define MP(a, b) make_pair(a, b)
#define SORT_UNIQUE(c)                                                         \\
  (sort(c.begin(), c.end()),                                                   \\
   c.resize(distance(c.begin(), unique(c.begin(), c.end()))))
#define GET_POS(c, x) (lower_bound(c.begin(), c.end(), x) - c.begin())
#define yes cout << "Yes" << endl
#define YES cout << "YES" << endl
#define no cout << "No" << endl
#define NO cout << "NO" << endl
#define Decimal fixed << setprecision(20)
#define INF 1000000000
#define LLINF 1000000000000000000LL

const int inf = 1e9;
const ll linf = 1LL << 50;
const double eps = 1e-10;
const int MOD = 1e9 + 7;
const int dx[4] = {-1, 0, 1, 0};
const int dy[4] = {0, -1, 0, 1};

struct Sieve {
  ll n;
  vll table;
  Sieve(ll n) : n(n), table(n + 1, 0) {
    for (ll i = 2; i <= n; i++) {
      if (table[i])
        continue;

      table[i] = i;
      for (ll j = i * i; j <= n; j += i)
        table[j] = i;
    }
  }

  vll factorList(ll x) {
    vll res;
    while (x > 1) {
      res.push_back(table[x]);
      x /= table[x];
    }

    return res;
  }

  vpl getFact(ll x) {
    map<ll, ll> m;
    vll fa = factorList(x);
    for (auto p : fa)
      m[p] += 1;

    SORT_UNIQUE(fa);
    vpl res;
    for (auto p : fa)
      res.push_back(pll(p, m[p]));

    return res;
  }
};

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);

  ll n;
  cin >> n;

  Sieve sieve(n);

  vll table(n + 1);
  vector<map<ll, ll>> m(n + 1);

  ll ans = 1;
  for (ll i = 2; i <= n; i++) {
    if (table[i])
      continue;
    if (sieve.table[i] == i) {
      table[i] = 2;
      m[i][i] += 1;
      continue;
    }

    ll cur = sieve.table[i];
    m[i] = m[i / cur];
    m[i][cur] += 1;
    table[i] = table[i / cur] / m[i][cur] * (m[i][cur] + 1);
  }

  REP(i, n) ans += (i + 1) * table[i + 1];

  cout << ans << endl;
}