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

#include <bits/stdc++.h>
#define rep(i, s, n) for (int i = s; i < n; i++)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define all_acc(x) (x).begin(), (x).end(), 0LL
#define int long long
using namespace std;
using P = pair<int, int>;
using Graph = vector<vector<int>>;
using ll = long long;

int accumulate(int *a, int n) { return accumulate(a, a + n, 0LL); }

int accumulate(vector<int> a) { return accumulate(a.begin(), a.end(), 0LL); }

vector<pair<int, int>> soinsuu(int n) {
  vector<pair<int, int>> ret;
  for (int i = 2; i * i <= n; i++) {
    if (n % i != 0)
      continue;
    int ex = 0;
    while (n % i == 0) {
      ex++;
      n /= i; // n変更することで、それ以降の約数で割り切れることはない
    }
    ret.push_back(make_pair(i, ex));
  }
  // nが素数だった場合
  if (n != 1)
    ret.push_back(make_pair(n, 1));
  return ret;
}

bool IsPrime(int num) {
  if (num < 2)
    return false;
  else if (num == 2)
    return true;
  else if (num % 2 == 0)
    return false; // 偶数はあらかじめ除く

  double sqrtNum = sqrt(num);
  for (int i = 3; i <= sqrtNum; i += 2) {
    if (num % i == 0) {
      // 素数ではない
      return false;
    }
  }

  // 素数である
  return true;
}

signed main() {
  int n;
  cin >> n;

  vector<int> f(n + 1, 0);
  for (int i = 1; i <= n; i++) {
    int a = i;
    while (a <= n) {
      f[a] = f[a] + 1;
      a += i;
    }
  }

  int result = 0;

  for (int i = 1; i <= n; i++) {
    result += i * f[i];
  }

  cout << result << endl;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define rep(i, s, n) for (int i = s; i < n; i++)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define all_acc(x) (x).begin(), (x).end(), 0LL
#define int long long
using namespace std;
using P = pair<int, int>;
using Graph = vector<vector<int>>;
using ll = long long;

int accumulate(int *a, int n) { return accumulate(a, a + n, 0LL); }

int accumulate(vector<int> a) { return accumulate(a.begin(), a.end(), 0LL); }

vector<pair<int, int>> soinsuu(int n) {
  vector<pair<int, int>> ret;
  for (int i = 2; i * i <= n; i++) {
    if (n % i != 0)
      continue;
    int ex = 0;
    while (n % i == 0) {
      ex++;
      n /= i; // n変更することで、それ以降の約数で割り切れることはない
    }
    ret.push_back(make_pair(i, ex));
  }
  // nが素数だった場合
  if (n != 1)
    ret.push_back(make_pair(n, 1));
  return ret;
}

bool IsPrime(int num) {
  if (num < 2)
    return false;
  else if (num == 2)
    return true;
  else if (num % 2 == 0)
    return false; // 偶数はあらかじめ除く

  double sqrtNum = sqrt(num);
  for (int i = 3; i <= sqrtNum; i += 2) {
    if (num % i == 0) {
      // 素数ではない
      return false;
    }
  }

  // 素数である
  return true;
}

signed main() {
  int n;
  cin >> n;

  int result = 0;

  vector<int> f(n + 1, 0);
  // for(int i=1;i<=n;i++) f[i]=i;

  for (int i = n; i >= 1; i--) {
    if (f[i] == 0) {
      vector<pair<int, int>> soin = soinsuu(i);
      int i2 = 1;
      int now = 1;

      for (auto p : soin) {
        int jou = p.second;

        for (int j = 1; j <= jou; j++) {
          now *= p.first;
          if (f[now] != 0)
            f[now] = i2 * (j + 1);
        }

        i2 *= (jou + 1);
      }

      f[i] = i2;
    }
  }

  for (int i = 1; i <= n; i++) {
    result += (i * f[i]);
  }

  cout << result << endl;
}