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

// #include <bits/stdc++.h>
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;

#include "boost/multiprecision/cpp_dec_float.hpp"
#include "boost/multiprecision/cpp_int.hpp"
namespace mp = boost::multiprecision;
typedef mp::cpp_int LL;
typedef mp::number<mp::cpp_dec_float<1024>>
    DD; // 仮数部が1024ビットの浮動小数点数型(TLEしたら小さくする)

typedef long double dd;
#define i_7 (ll)(1E9 + 7)
// #define i_7 998244353
#define i_5 i_7 - 2
ll mod(ll a) {
  ll c = a % i_7;
  if (c >= 0)
    return c;
  return c + i_7;
}
typedef pair<ll, ll> l_l;
typedef pair<dd, dd> d_d;
ll inf = (ll)1E16;
#define rep(i, l, r) for (ll i = l; i <= r; i++)
#define rrep(i, r, l) for (ll i = r; i >= l; i--)
#define pb push_back
ll max(ll a, ll b) {
  if (a < b)
    return b;
  else
    return a;
}
ll min(ll a, ll b) {
  if (a > b)
    return b;
  else
    return a;
}
void Max(ll &pos, ll val) { pos = max(pos, val); } // Max(dp[n],dp[n-1]);
void Min(ll &pos, ll val) { pos = min(pos, val); }
void Add(ll &pos, ll val) { pos = mod(pos + val); }
dd EPS = 1E-9;
#define fastio                                                                 \\
  ios::sync_with_stdio(false);                                                 \\
  cin.tie(0);                                                                  \\
  cout.tie(0);
#define fi first
#define se second
#define endl                                                                   \\
  "\\n" // インタラクティブで消す！！！！！！！！！！！！！！！！！！！！！
#define SORT(v) sort(v.begin(), v.end())
#define ERASE(v) v.erase(unique(v.begin(), v.end()), v.end())
#define POSL(v, x) (lower_bound(v.begin(), v.end(), x) - v.begin())
#define POSU(v, x) (upper_bound(v.begin(), v.end(), x) - v.begin())
template <class T, class S> inline bool chmax(T &a, S b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T, class S> inline bool chmin(T &a, S b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}

void mod_print(ll k) {
  ll P = 1000;
  rep(y, 1, P) {
    ll x = mod(y * k);
    if (x + P >= i_7) {
      x -= i_7;
    }
    if (abs(x) <= P) {
      // cout<<x<<"/"<<y;
      cout << setprecision(5) << (dd)x / (dd)y;
      return;
    }
  }
  cout << "nun" << endl;
}
#define all(c) c.begin(), c.end()
//////////////////////////

ll cal(ll a, ll b) {
  ll res = 0;
  while (a > 0) {
    if (a % b == 0) {
      a /= b;
      res++;
    } else {
      break;
    }
  }
  return res;
}

int main() {
  fastio ll n;
  cin >> n;
  ll f[n + 1];
  rep(i, 1, n) f[i] = 1;
  bool used[n + 1];
  memset(used, false, sizeof(used));
  rep(i, 2, n) {
    if (used[i])
      continue;
    for (ll j = i * 2; j <= n; j += i)
      used[j] = true;
  }
  //   rep(i,1,n)cout<<used[i]<<" ";cout<<endl;

  rep(i, 2, n) {

    if (used[i])
      continue;
    if (i * i > n) {
      for (ll j = i; j <= n; j += i) {
        f[j] *= 2;
      }
      continue;
    }
    for (ll j = i; j <= n; j += i) {
      ll c = cal(j, i);
      f[j] *= c + 1;
    }

    /*map<ll,ll>mp;
    ll s=i;
    while(s<=n){
        for(ll j=s;j<=n;j+=s){
            mp[j]++;
        }
        s*=i;
    }

    for(auto x:mp){
        f[x.fi]*=x.se+1;
    }*/
  }
  ll ans = 0;
  //  rep(i,1,n)cout<<f[i]<<" ";cout<<endl;

  rep(i, 1, n) { ans += i * f[i]; }
  cout << ans;

  return 0;
}


Error: TLE

Fixed submission:

// #include <bits/stdc++.h>
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;

#include "boost/multiprecision/cpp_dec_float.hpp"
#include "boost/multiprecision/cpp_int.hpp"
namespace mp = boost::multiprecision;
typedef mp::cpp_int LL;
typedef mp::number<mp::cpp_dec_float<1024>>
    DD; // 仮数部が1024ビットの浮動小数点数型(TLEしたら小さくする)

typedef long double dd;
#define i_7 (ll)(1E9 + 7)
// #define i_7 998244353
#define i_5 i_7 - 2
ll mod(ll a) {
  ll c = a % i_7;
  if (c >= 0)
    return c;
  return c + i_7;
}
typedef pair<ll, ll> l_l;
typedef pair<dd, dd> d_d;
ll inf = (ll)1E16;
#define rep(i, l, r) for (ll i = l; i <= r; i++)
#define rrep(i, r, l) for (ll i = r; i >= l; i--)
#define pb push_back
ll max(ll a, ll b) {
  if (a < b)
    return b;
  else
    return a;
}
ll min(ll a, ll b) {
  if (a > b)
    return b;
  else
    return a;
}
void Max(ll &pos, ll val) { pos = max(pos, val); } // Max(dp[n],dp[n-1]);
void Min(ll &pos, ll val) { pos = min(pos, val); }
void Add(ll &pos, ll val) { pos = mod(pos + val); }
dd EPS = 1E-9;
#define fastio                                                                 \\
  ios::sync_with_stdio(false);                                                 \\
  cin.tie(0);                                                                  \\
  cout.tie(0);
#define fi first
#define se second
#define endl                                                                   \\
  "\\n" // インタラクティブで消す！！！！！！！！！！！！！！！！！！！！！
#define SORT(v) sort(v.begin(), v.end())
#define ERASE(v) v.erase(unique(v.begin(), v.end()), v.end())
#define POSL(v, x) (lower_bound(v.begin(), v.end(), x) - v.begin())
#define POSU(v, x) (upper_bound(v.begin(), v.end(), x) - v.begin())
template <class T, class S> inline bool chmax(T &a, S b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T, class S> inline bool chmin(T &a, S b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}

void mod_print(ll k) {
  ll P = 1000;
  rep(y, 1, P) {
    ll x = mod(y * k);
    if (x + P >= i_7) {
      x -= i_7;
    }
    if (abs(x) <= P) {
      // cout<<x<<"/"<<y;
      cout << setprecision(5) << (dd)x / (dd)y;
      return;
    }
  }
  cout << "nun" << endl;
}
#define all(c) c.begin(), c.end()
//////////////////////////

int main() {
  fastio ll n;
  cin >> n;
  ll f[n + 1];
  rep(i, 1, n) f[i] = 1;
  bool used[n + 1];
  memset(used, false, sizeof(used));
  rep(i, 2, n) {
    if (used[i])
      continue;
    map<ll, ll> mp;
    ll s = i;
    while (s <= n) {
      for (ll j = s; j <= n; j += s) {
        used[j] = true;
        mp[j]++;
      }
      s *= i;
    }

    for (auto x : mp) {
      f[x.fi] *= x.se + 1;
    }
  }
  ll ans = 0;
  // rep(i,1,n)cout<<f[i]<<" ";cout<<endl;

  rep(i, 1, n) { ans += i * f[i]; }
  cout << ans;

  return 0;
}