// #define LOCAL
#include "bits/stdc++.h"
using namespace std;
#define FAST ios_base::sync_with_stdio(false); cin.tie(0);
#define LLINF ((long long) 1e18)//1234567890987654321
#define INF 1234567890ll
#define pb push_back
#define eb emplace_back
#define ins insert
#define f first
#define s second	
#define db 0
#define EPS (1e-7)    //0.0000001 the value
#define PI (acos((ld)-1.0))
#define MAXN (300006)
#define ll long long int 
#define ld long double
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());    //can be used by calling rng() or shuffle(A, A+n, rng)
#define FOR(ii, ss, ee) for(ll ii = (ss); ii <= (ll)(ee); ++ii)
#define DEC(ii, ss, ee) for(ll ii = (ss); ii >= (ll)(ee); --ii)
#define space " "
#define cbr cerr << "hi\n"
#define mmst(x, v) memset((x), v, sizeof ((x)))
#define siz(x) ((ll)x.size())
#define ph push
#define btinpct(x) __builtin_popcountll((x))
#define MSB(bm) ((bm==0)?-1:(63-__builtin_clzll((bm))))
#define all(x) (x).begin(), (x).end()
#define lbd(x, y) lower_bound(all(x), y)
#define ubd(x, y) upper_bound(all(x), y)
typedef pair <ll, ll> pi;
typedef pair <ll, pi> spi;
typedef pair <pi, pi> dpi;
inline ll rand(ll x, ll y) { ++y; return (rng() % (y-x)) + x; } //inclusivesss
string to_string(char c) {string s(1,c);return s;}string to_string(bool b){return (b ? "true" : "false");}template <typename A, typename B>string to_string(pair<A, B> p) {return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";}template <typename A>string to_string(A v) {bool first = true;string res = "{";for (const auto &x : v) {if (!first) {res += ", ";}first = false;res += to_string(x);}res += "}";return res;}void degug_out() { cerr << endl; }template <typename Head, typename... Tail>void degug_out(Head H, Tail... T) {cerr << " " << to_string(H);degug_out(T...);}inline ll gcd(ll a,ll b){if(a>b)swap(a,b);if(a==0)return b;return gcd(b%a,a);}
#ifdef LOCAL
// #define degug(...) cerr << "[" << #__VA_ARGS__ << "]:", degug_out(__VA_ARGS__)
#else
// #define degug(...) 663
#define cerr if(0)cout
#endif
#warning "// FOR has been inclusive now!!!!"

ll n, K, rt;

const ll MOD=1e9+7;
inline void add(ll &x,ll y) { x%=MOD, y%=MOD; x+=y; if(x<0) x+=MOD; else x%=MOD; }
inline ll mult(ll x,ll y) { return ((x%MOD)*(y%MOD))%MOD; }
inline ll appear(ll x) { ll t1=max(rt,K/x), t2=max(rt,K/(x+1));
	if(x>K) return 0;
	// ll ans2=0; for(ll i=max(rt+1, K/(x+1)+1);i<=K;++i) if(K/i == x) ans2+=(K/i == x); else if(K/i < x) break; /*return ans2;*/ if(!(ans2 == t1-t2)) { cout<<"wrong: "<<ans2<<' '<<t1<<' '<<t2<<' '<<x<<'\n'; assert(0); exit(0); }
	return t1-t2;
} 
ll psum_l[40008], dp_l[102][40008], dp_s[102][40008], psum_s[40008];

int main() // FOR has been inclusive now!!!!
{
	cin>>K>>n; rt=sqrt(K);
	FOR(j,1,rt) dp_s[1][j]=dp_l[1][j]=1;
	FOR(j,1,rt) add(psum_s[j], psum_s[j-1] + dp_s[1][j]);
	FOR(j,1,rt) add(psum_l[j], psum_l[j-1] + mult(dp_l[1][j], appear(j)));
	// cerr<<rt<<' '<<psum_s[40001]+psum_l[40001]<<'\n';
	cerr<<1<<'\n';
	cerr<<"s: ";FOR(j,1,rt) {
		cerr<<dp_s[1][j]<<' ';
	} cerr<<'\n';
	cerr<<"l: ";FOR(j,1,rt) {
		cerr<<dp_l[1][j]<<' ';
	} cerr<<'\n';
	cerr<<psum_s[100]<<' '<<psum_l[100]<<'\n';
	FOR(i,2,n) {
		FOR(j,1,rt) {
			add(dp_s[i][j], psum_s[rt]);
			add(dp_s[i][j], psum_l[rt]-psum_l[j-1]);
		}
		FOR(j,1,rt) {
			add(dp_l[i][j],psum_s[j]);
			// add(dp_l[i][j],dp_s[i-1][j]);
		}
		FOR(j,1,rt) psum_s[j]=0, add(psum_s[j], psum_s[j-1] + dp_s[i][j]);
		FOR(j,1,rt) psum_l[j]=0, add(psum_l[j], psum_l[j-1] + mult(dp_l[i][j], appear(j)));
		cerr<<i<<'\n';
		cerr<<"s: ";FOR(j,1,rt) {
			cerr<<dp_s[i][j]<<' ';
		} cerr<<'\n';
		cerr<<"l: ";FOR(j,1,rt) {
			cerr<<dp_l[i][j]<<' ';
		} cerr<<'\n';
	}
	ll ans=0;
	add(ans, psum_s[rt]+psum_l[rt]);
	cout<<ans<<'\n';
}


Measured memory_bytes: 63616