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; }