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

#include <bits/stdc++.h>
using namespace std;
#define lli long long int
#define uli unsigned long long int
#define rep(i, m, n) for (lli i = m; i < (n); i++)
#define repe(i, m, n) for (lli i = m; i <= (n); i++)
#define ALL(x) (x).begin(), (x).end()
#define SIZE(x) ((lli)(x).size())
#define MAX(x) *max_element(ALL(x))
#define MIN(x) *min_element(ALL(x))
#define _GLIBCXX_DEBUG
const lli INF = 2147483647;
const lli MINF = -2147483648;
const lli LINF = 9223372036854775807;
const lli MOD = 1000000007; // 10^9+7
const double PI = acos(-1);
#define SORT(n) sort(n.begin(), n.end())
#define SORTR(n) sort(n.begin(), n.end(), greater<int>())
#define REV(n) reverse(n.begin(), n.end())
#define pb push_back
#define eb emplace_back
#define mp make_pair
#pragma GCC optimize("Ofast")
using vi = vector<int>;
using vvi = vector<vi>;
using vvvi = vector<vvi>;
using vlli = vector<lli>;
using vvli = vector<vlli>;
using vs = vector<string>;
using vvs = vector<vs>;
using vb = vector<bool>;
using vvb = vector<vb>;
using ll = long long;
// vector入力
template <typename T> istream &operator>>(istream &is, vector<T> &vec) {
  for (T &x : vec)
    is >> x;
  return is;
}
// vector出力
template <typename T> ostream &operator<<(ostream &os, vector<T> &vec) {
  // os << '{';
  for (int i = 0; i < vec.size(); i++) {
    os << vec[i] << (i + 1 == vec.size() ? "" : "");
  }
  // os << '}';
  return os;
}
// aよりもbが大きいならばaをbで更新する(更新されたならばtrueを返す)
template <typename T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b; // aをbで更新
    return true;
  }
  return false;
}
// aよりもbが小さいならばaをbで更新する(更新されたならばtrueを返す)
template <typename T> bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b; // aをbで更新
    return true;
  }
  return false;
}

/*  divisor(n)
    入力：整数 n
    出力：nのすべての約数
    計算量：O(√n)
*/
lli divisor(lli n) {
  // vlli ret;
  lli count = 0;
  for (lli i = 1; i * i <= n; i++) {
    if (n % i == 0) {
      // ret.push_back(i);
      count++;
      if (i * i != n) {
        // ret.push_back(n / i);
        count++;
      }
    }
  }
  return count;
}
lli prime_factorize(long long N) {
  lli count = 1;
  for (long long a = 2; a * a <= N; ++a) {
    if (N % a != 0)
      continue;
    long long ex = 0;
    while (N % a == 0) {
      ++ex;
      N /= a;
    }
    count++;
  }
  if (N != 1)
    count++;
  return count;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  lli a, b, c, h, n, w, ans = 1, count = 0;
  string s, t;
  vector<pair<string, pair<lli, lli>>> pr;
  cin >> n;
  vlli d, e;
  // map<lli, lli> mp;
  // vector<lli> x(n + 1);
  // vector<long long> ex(n + 1, 0); // exp[p] := p の指数
  // lli num = n;
  // for (lli i = 2; i <= n; i++)
  // {
  //   while (num % i == 0)
  //   { // 素数で割り切れなくなるまで割っていく
  //     x.at(i)++;
  //     //割った個数を配列に足す
  //     num /= i;
  //   }
  // }
  // for (lli i = 2; i <= n; i++)
  // {
  //   ans *= x.at(i) + 1;
  //   //それぞれを+1して掛けていく
  // }

  // c = divisor(10000000);
  repe(i, 1, n) {
    // b = divisor(i);
    b = n / i;
    count += i * b * (b + 1) / 2;
    // cout << "b: " << b << endl;
  }
  // repe(i, 1, n)
  // {
  //   lli pf = prime_factorize(i);
  //   cout << pf << endl;
  // }

  cout << count << endl;
  // cout << c << endl;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define lli long long int
#define uli unsigned long long int
#define rep(i, m, n) for (lli i = m; i < (n); i++)
#define repe(i, m, n) for (lli i = m; i <= (n); i++)
#define ALL(x) (x).begin(), (x).end()
#define SIZE(x) ((lli)(x).size())
#define MAX(x) *max_element(ALL(x))
#define MIN(x) *min_element(ALL(x))
#define _GLIBCXX_DEBUG
const lli INF = 2147483647;
const lli MINF = -2147483648;
const lli LINF = 9223372036854775807;
const lli MOD = 1000000007; // 10^9+7
const double PI = acos(-1);
#define SORT(n) sort(n.begin(), n.end())
#define SORTR(n) sort(n.begin(), n.end(), greater<int>())
#define REV(n) reverse(n.begin(), n.end())
#define pb push_back
#define eb emplace_back
#define mp make_pair
#pragma GCC optimize("Ofast")
using vi = vector<int>;
using vvi = vector<vi>;
using vvvi = vector<vvi>;
using vlli = vector<lli>;
using vvli = vector<vlli>;
using vs = vector<string>;
using vvs = vector<vs>;
using vb = vector<bool>;
using vvb = vector<vb>;
using ll = long long;
// vector入力
template <typename T> istream &operator>>(istream &is, vector<T> &vec) {
  for (T &x : vec)
    is >> x;
  return is;
}
// vector出力
template <typename T> ostream &operator<<(ostream &os, vector<T> &vec) {
  // os << '{';
  for (int i = 0; i < vec.size(); i++) {
    os << vec[i] << (i + 1 == vec.size() ? "" : "");
  }
  // os << '}';
  return os;
}
// aよりもbが大きいならばaをbで更新する(更新されたならばtrueを返す)
template <typename T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b; // aをbで更新
    return true;
  }
  return false;
}
// aよりもbが小さいならばaをbで更新する(更新されたならばtrueを返す)
template <typename T> bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b; // aをbで更新
    return true;
  }
  return false;
}

/*  divisor(n)
    入力：整数 n
    出力：nのすべての約数
    計算量：O(√n)
*/
lli divisor(lli n) {
  // vlli ret;
  lli count = 0;
  for (lli i = 1; i * i <= n; i++) {
    if (n % i == 0) {
      // ret.push_back(i);
      count++;
      if (i * i != n) {
        // ret.push_back(n / i);
        count++;
      }
    }
  }
  return count;
}

void prime_factorize(lli n, map<lli, lli> &prime) {
  if (n <= 1)
    return;
  lli last = sqrt(n);
  for (lli i = 2; i <= last; i++) {
    if (n % i == 0) {
      prime_factorize(i, prime);
      prime_factorize(n / i, prime);
      return;
    }
  }
  prime[n]++;
  return;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  lli a, b, c, h, n, w, ans = 1, count = 0;
  string s, t;
  vector<pair<string, pair<lli, lli>>> pr;
  cin >> n;
  vlli d, e;
  map<lli, lli> mp;
  vector<lli> x(n + 1);
  // vector<long long> ex(n + 1, 0); // exp[p] := p の指数
  // lli num = n;
  // for (lli i = 2; i <= n; i++)
  // {
  //   while (num % i == 0)
  //   { // 素数で割り切れなくなるまで割っていく
  //     x.at(i)++;
  //     //割った個数を配列に足す
  //     num /= i;
  //   }
  // }
  // for (lli i = 2; i <= n; i++)
  // {
  //   ans *= x.at(i) + 1;
  //   //それぞれを+1して掛けていく
  // }

  repe(i, 1, n) {
    b = divisor(i);
    count += i * b;
    // cout << "b: " << b << endl;
  }

  cout << count << endl;
}