#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef long double ld;
typedef complex<ld> cd;

typedef pair<int, int> pi;
typedef pair<ll,ll> pl;
typedef pair<ld,ld> pd;

typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
typedef vector<cd> vcd;

template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>;

#define FOR(i, a, b) for (int i=a; i<(b); i++)
#define F0R(i, a) for (int i=0; i<(a); i++)
#define FORd(i,a,b) for (int i = (b)-1; i >= a; i--)
#define F0Rd(i,a) for (int i = (a)-1; i >= 0; i--)

#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(), x.end()

const int MOD = 1000000007;
const ll INF = 1e18;
const int MX = 100000; //check the limits, dummy

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);

    int N, K; cin >> N >> K;
    /*if (N <= 100000) {
        ll dp[N][K];
        F0R(i, N) {
            F0R(j, K) {
                dp[i][j] = 0;
            }
        }
        ll suffix[N]; F0R(i, N) suffix[i] = 0;
        suffix[N-1] = 1;
        F0R(i, K) {
            ll cur = 0;
            F0Rd(j, N) {
                cur += suffix[j];
                cur = cur % MOD;
                dp[j][i] = cur;
                suffix[j] = 0;
            }

            F0R(j, N) {
                int curVal = j+1;
                int maxVal = N / curVal;
                maxVal--;
                suffix[maxVal] += dp[j][i];
                suffix[maxVal] = suffix[maxVal] % MOD;
            }
        }

        ll ans = 0;
        F0R(i, N) {
            ans += dp[i][K-1];
        }
        cout << ans % MOD << endl;
        return 0;

    }*/

    ll root = sqrt(N) + 1;
    ll dpS[root][K];
    ll dpL[root][K];
    F0R(i, root) {
        F0R(j, K) {
            dpS[i][j] = 0;
            dpL[i][j] = 0;
        }
    }

    ll countLarge[root];
    F0R(i, root) {
        countLarge[i] = max(N / (i+1), (int) root) - max(N / (i+2), (int) root);
    }



    ll sufS[root], preL[root];
    F0R(i, root) {
        sufS[i] = 0; preL[i] = 0;
    }
    sufS[root-1] = 1;
    preL[0] = 1;

    F0R(i, K) {
        ll curSum = 0;
        F0Rd(j, root) {
            curSum += sufS[j];
            sufS[j] = 0;
            curSum = curSum % MOD;
            dpS[j][i] = curSum;
        }
        curSum = 0;
        F0R(j, root) {
            curSum += preL[j];
            curSum = curSum % MOD;
            preL[j] = 0;

            dpL[j][i] = (curSum*countLarge[j]) % MOD;
        }

        F0R(j, root) {
            ll maxVal = N / (j+1);
            if (maxVal > root) maxVal = root;
            sufS[maxVal-1] += dpS[j][i];
            sufS[maxVal-1] = sufS[maxVal-1] % MOD;
            preL[j] += dpS[j][i];
            preL[j] = preL[j] % MOD;
        }

        F0R(j, root) {
            sufS[j] += dpL[j][i];
            sufS[j] = sufS[j] % MOD;
        }
    }

    ll ans = 0;
    F0R(i, root) {
        ans += dpL[i][K-1] + dpS[i][K-1];
        ans %= MOD;
    }

    cout << ans << endl;


    return 0;
}

// read the question correctly (ll vs int)
// template by bqi343

Measured memory_bytes: 50432