Problem p03418 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
#define whlie while
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define rep(i, N) for (int i = 0; i < (N); i++)
#define repr(i, N) for (int i = (N)-1; i >= 0; i--)
#define rep1(i, N) for (int i = 1; i <= (N); i++)
#define repr1(i, N) for (int i = (N); i > 0; i--)
#define each(x, v) for (auto &x : v)
#define all(v) (v).begin(), (v).end()
#define sz(v) ((int)(v).size())
#define ini(...)                                                               \
  int __VA_ARGS__;                                                             \
  in(__VA_ARGS__)
#define inl(...)                                                               \
  ll __VA_ARGS__;                                                              \
  in(__VA_ARGS__)
#define ins(...)                                                               \
  string __VA_ARGS__;                                                          \
  in(__VA_ARGS__)
using namespace std;
void solve();
using ll = long long;
using vl = vector<ll>;
using vi = vector<int>;
using vvi = vector<vector<int>>;
constexpr int inf = 1001001001;
constexpr ll infLL = (1LL << 61) - 1;
struct IoSetupNya {
  IoSetupNya() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(15);
    cerr << fixed << setprecision(7);
  }
} iosetupnya;
template <typename T, typename U> inline bool amin(T &x, U y) {
  return (y < x) ? (x = y, true) : false;
}
template <typename T, typename U> inline bool amax(T &x, U y) {
  return (x < y) ? (x = y, true) : false;
}
template <typename T, typename U>
ostream &operator<<(ostream &os, const pair<T, U> &p) {
  os << p.first << " " << p.second;
  return os;
}
template <typename T, typename U>
istream &operator>>(istream &is, pair<T, U> &p) {
  is >> p.first >> p.second;
  return is;
}
template <typename T> ostream &operator<<(ostream &os, const vector<T> &v) {
  int s = (int)v.size();
  rep(i, s) os << (i ? " " : "") << v[i];
  return os;
}
template <typename T> istream &operator>>(istream &is, vector<T> &v) {
  for (auto &x : v)
    is >> x;
  return is;
}
void in() {}
template <typename T, class... U> void in(T &t, U &...u) {
  cin >> t;
  in(u...);
}
void out() { cout << "\n"; }
template <typename T, class... U> void out(const T &t, const U &...u) {
  cout << t;
  if (sizeof...(u))
    cout << " ";
  out(u...);
}
template <typename T> void die(T x) {
  out(x);
  exit(0);
}
#ifdef NyaanDebug
#include "NyaanDebug.h"
#define trc(...)                                                               \
  do {                                                                         \
    cerr << #__VA_ARGS__ << " = ";                                             \
    dbg_out(__VA_ARGS__);                                                      \
  } while (0)
#define trca(v, N)                                                             \
  do {                                                                         \
    cerr << #v << " = ";                                                       \
    array_out(v, N);                                                           \
    cout << endl;                                                              \
  } while (0)
#else
#define trc(...)
#define trca(...)
int main() { solve(); }
#endif
using P = pair<ll, ll>;
using vp = vector<P>;
constexpr int MOD = /** 1000000007; //*/ 998244353;
/////////

void solve() {
  ini(N, K);
  ll ans = 0;
  // a = d * b + rem , b > rem >= K
  // bを固定
  for (int b = K + 1; b <= N; b++) {
    // remとしてあり得るのは rem = K , K+1 , ... , b-1
    // d = 0のとき a = K , ... , b - 1
    // d = 1のとき a = b + K , ... , b + (b - 1)
    // d = 2のとき a = 2b+ K m ... , 2b+ (b - 1)
    // という風になる
    // -> bまででb-K個、2bまでで2(b-k)個...

    int ld = N / b;
    ans += ld * (b - K);

    // 残りは全探索
    for (int n = ld * b + 1; n <= N; n++) {
      ans += n % b >= K;
    }
  }

  out(ans);
}

Fixed submission:
#include <bits/stdc++.h>
#define whlie while
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define rep(i, N) for (int i = 0; i < (N); i++)
#define repr(i, N) for (int i = (N)-1; i >= 0; i--)
#define rep1(i, N) for (int i = 1; i <= (N); i++)
#define repr1(i, N) for (int i = (N); i > 0; i--)
#define each(x, v) for (auto &x : v)
#define all(v) (v).begin(), (v).end()
#define sz(v) ((int)(v).size())
#define ini(...)                                                               \
  int __VA_ARGS__;                                                             \
  in(__VA_ARGS__)
#define inl(...)                                                               \
  ll __VA_ARGS__;                                                              \
  in(__VA_ARGS__)
#define ins(...)                                                               \
  string __VA_ARGS__;                                                          \
  in(__VA_ARGS__)
using namespace std;
void solve();
using ll = long long;
using vl = vector<ll>;
using vi = vector<int>;
using vvi = vector<vector<int>>;
constexpr int inf = 1001001001;
constexpr ll infLL = (1LL << 61) - 1;
struct IoSetupNya {
  IoSetupNya() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(15);
    cerr << fixed << setprecision(7);
  }
} iosetupnya;
template <typename T, typename U> inline bool amin(T &x, U y) {
  return (y < x) ? (x = y, true) : false;
}
template <typename T, typename U> inline bool amax(T &x, U y) {
  return (x < y) ? (x = y, true) : false;
}
template <typename T, typename U>
ostream &operator<<(ostream &os, const pair<T, U> &p) {
  os << p.first << " " << p.second;
  return os;
}
template <typename T, typename U>
istream &operator>>(istream &is, pair<T, U> &p) {
  is >> p.first >> p.second;
  return is;
}
template <typename T> ostream &operator<<(ostream &os, const vector<T> &v) {
  int s = (int)v.size();
  rep(i, s) os << (i ? " " : "") << v[i];
  return os;
}
template <typename T> istream &operator>>(istream &is, vector<T> &v) {
  for (auto &x : v)
    is >> x;
  return is;
}
void in() {}
template <typename T, class... U> void in(T &t, U &...u) {
  cin >> t;
  in(u...);
}
void out() { cout << "\n"; }
template <typename T, class... U> void out(const T &t, const U &...u) {
  cout << t;
  if (sizeof...(u))
    cout << " ";
  out(u...);
}
template <typename T> void die(T x) {
  out(x);
  exit(0);
}
#ifdef NyaanDebug
#include "NyaanDebug.h"
#define trc(...)                                                               \
  do {                                                                         \
    cerr << #__VA_ARGS__ << " = ";                                             \
    dbg_out(__VA_ARGS__);                                                      \
  } while (0)
#define trca(v, N)                                                             \
  do {                                                                         \
    cerr << #v << " = ";                                                       \
    array_out(v, N);                                                           \
    cout << endl;                                                              \
  } while (0)
#else
#define trc(...)
#define trca(...)
int main() { solve(); }
#endif
using P = pair<ll, ll>;
using vp = vector<P>;
constexpr int MOD = /** 1000000007; //*/ 998244353;
/////////

void solve() {
  ini(N, K);
  ll ans = 0;
  // a = d * b + rem , b > rem >= K
  // bを固定
  for (int b = K + 1; b <= N; b++) {
    // remとしてあり得るのは rem = K , K+1 , ... , b-1
    // d = 0のとき a = K , ... , b - 1
    // d = 1のとき a = b + K , ... , b + (b - 1)
    // d = 2のとき a = 2b+ K m ... , 2b+ (b - 1)
    // という風になる
    // -> bまででb-K個、2bまでで2(b-k)個...

    int ld = N / b;
    ans += ld * (b - K);

    // K == 0のとき0が含まれてしまう
    if (K == 0)
      ans -= 1;

    // 残りは？
    // a が ld * b から ld * (b + 1) - 1 までなら(b - k)個
    // しかし実際は右端がNまで
    ans += max(0LL, b - K - (1LL * (ld + 1) * b - 1 - N));
  }

  out(ans);
}