AtCoder Beginner Contest F. Small Products

https://atcoder.jp/contests/abc132/tasks/abc132_f


We have
\[ k \le \left\lfloor \frac{N}{i} \right\rfloor \iff i * k \le N \iff i \le \left\lfloor \frac{N}{k} \right\rfloor. \]

\[ \underbrace{\left\lfloor \frac{N}{1} \right\rfloor, \left\lfloor \frac{N}{2} \right\rfloor , \ldots , \left\lfloor \frac{N}{\left\lfloor \frac{N}{K} \right\rfloor - 1} \right\rfloor, \left\lfloor \frac{N}{\left\lfloor \frac{N}{K} \right\rfloor}\right\rfloor}_{{}\ge K} , \underbrace{\left\lfloor \frac{N}{\left\lfloor \frac{N}{K} \right\rfloor + 1} \right\rfloor, \left\lfloor \frac{N}{\left\lfloor \frac{N}{K} \right\rfloor + 2}\right\rfloor , \ldots, \left\lfloor \frac{N}{N-1} \right\rfloor, \left\lfloor \frac{N}{N} \right\rfloor}_{{}\lt K} \]

#include <bits/stdc++.h>

#define rep(i, n) for (int i = 0; i < (n); i++)
#define repr(i, n) for (int i = (n) - 1; i >= 0; i--)

using namespace std;
using ll = long long;

const int MOD = 1000000007;

struct mint { int n; mint(int n_ = 0) : n(n_) {} };
mint operator-(mint a) { return -a.n + MOD * (a.n != 0); }
mint operator+(mint a, mint b) { int x = a.n + b.n; return x - (x >= MOD) * MOD; }
mint operator-(mint a, mint b) { int x = a.n - b.n; return x + (x < 0) * MOD; }
mint operator*(mint a, mint b) { return (long long)a.n * b.n % MOD; }
mint &operator+=(mint &a, mint b) { return a = a + b; }
mint &operator-=(mint &a, mint b) { return a = a - b; }
mint &operator*=(mint &a, mint b) { return a = a * b; }
istream &operator>>(istream &i, mint &a) { return i >> a.n; }
ostream &operator<<(ostream &o, mint a) { return o << a.n; }

int main() {
  cin.tie(nullptr);
  ios::sync_with_stdio(false);
  int N, K;
  cin >> N >> K;
  vector<int> val;
  for (int i = 1; i * i <= N; i++) {
    val.push_back(i);
    if (i != N / i) {
      val.push_back(N / i);
    }
  }
  sort(val.rbegin(), val.rend());
  vector<int> bar;
  for (int v : val) bar.push_back(N / (v + 1) + 1);
  bar.push_back(N+1);
  const int m = bar.size() - 1;
  vector<mint> dp0(m+1);
  dp0[0] = 1;
  rep(i, K) {
    vector<mint> dp1(m+1);
    rep(j, m) {
      dp1[0] += dp0[j];
      dp1[m - j] -= dp0[j];
    }
    rep(j, m) {
      dp1[j+1] += dp1[j];
      dp1[j] *= bar[j+1]-bar[j];
    }
    dp0 = dp1;
  }
  mint ans = 0;
  rep(j, m) {
    ans += dp0[j];
  }
  cout << ans << endl;
}