#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;
const int MAX = 1e6+5;
const int MOD = 1e9+7;
int n, k;
int t[MAX*4], lazy[MAX*4];
void push(int id, int l, int r){
if(lazy[id]!=0){
int mid = (l+r)/2;
(t[id*2] += (mid-l+1) * lazy[id] % MOD) %= MOD;
(lazy[id*2] += lazy[id]) %= MOD;
(t[id*2+1] += (r-mid) * lazy[id] % MOD) %= MOD;
(lazy[id*2+1] += lazy[id]) %= MOD;
lazy[id] = 0;
return;
}
}
void update(int id, int l, int r, int u, int v, int w){
if(v<l || r<u) return;
if(u<=l && r<=v){
(t[id] += (r-l+1) * w % MOD) %= MOD;
(lazy[id] += w) %= MOD;
return;
}
push(id, l, r);
int mid = (l+r)/2;
update(id*2, l, mid, u, v, w);
update(id*2+1, mid+1, r, u, v, w);
t[id] = (t[id*2] + t[id*2+1]) % MOD;
}
ll get(int id, int l, int r, int u, int v){
if(v<l || r<u) return 0;
if(u<=l && r<=v) return t[id];
push(id, l, r);
int mid = (l+r)/2;
ll t1 = get(id*2, l, mid, u, v);
ll t2 = get(id*2+1, mid+1, r, u, v);
return (t1+t2)%MOD;
}
signed main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> k;
update(1, 1, n, 1, 1, 1);
for(int i = 1; i<=n; i++){
ll val = get(1, 1, n, i, i);
update(1, 1, n, i+1, min(n, i+k), val);
}
cout << get(1, 1, n, n, n);
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBpbnQgbG9uZyBsb25nCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnR5cGVkZWYgbG9uZyBsb25nIGxsOwpjb25zdCBpbnQgTUFYID0gMWU2KzU7CmNvbnN0IGludCBNT0QgPSAxZTkrNzsKaW50IG4sIGs7CmludCB0W01BWCo0XSwgbGF6eVtNQVgqNF07CnZvaWQgcHVzaChpbnQgaWQsIGludCBsLCBpbnQgcil7CiAgICBpZihsYXp5W2lkXSE9MCl7CiAgICAgICAgaW50IG1pZCA9IChsK3IpLzI7CiAgICAgICAgKHRbaWQqMl0gKz0gKG1pZC1sKzEpICogbGF6eVtpZF0gJSBNT0QpICU9IE1PRDsKICAgICAgICAobGF6eVtpZCoyXSArPSBsYXp5W2lkXSkgJT0gTU9EOwogICAgICAgICh0W2lkKjIrMV0gKz0gKHItbWlkKSAqIGxhenlbaWRdICUgTU9EKSAlPSBNT0Q7CiAgICAgICAgKGxhenlbaWQqMisxXSArPSBsYXp5W2lkXSkgJT0gTU9EOwogICAgICAgIGxhenlbaWRdID0gMDsKICAgICAgICByZXR1cm47CiAgICB9Cn0Kdm9pZCB1cGRhdGUoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgdiwgaW50IHcpewogICAgaWYodjxsIHx8IHI8dSkgcmV0dXJuOwogICAgaWYodTw9bCAmJiByPD12KXsKICAgICAgICAodFtpZF0gKz0gKHItbCsxKSAqIHcgJSBNT0QpICU9IE1PRDsKICAgICAgICAobGF6eVtpZF0gKz0gdykgJT0gTU9EOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHB1c2goaWQsIGwsIHIpOwogICAgaW50IG1pZCA9IChsK3IpLzI7CiAgICB1cGRhdGUoaWQqMiwgbCwgbWlkLCB1LCB2LCB3KTsKICAgIHVwZGF0ZShpZCoyKzEsIG1pZCsxLCByLCB1LCB2LCB3KTsKICAgIHRbaWRdID0gKHRbaWQqMl0gKyB0W2lkKjIrMV0pICUgTU9EOwp9CmxsIGdldChpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2KXsKICAgIGlmKHY8bCB8fCByPHUpIHJldHVybiAwOwogICAgaWYodTw9bCAmJiByPD12KSByZXR1cm4gdFtpZF07CiAgICBwdXNoKGlkLCBsLCByKTsKICAgIGludCBtaWQgPSAobCtyKS8yOwogICAgbGwgdDEgPSBnZXQoaWQqMiwgbCwgbWlkLCB1LCB2KTsKICAgIGxsIHQyID0gZ2V0KGlkKjIrMSwgbWlkKzEsIHIsIHUsIHYpOwogICAgcmV0dXJuICh0MSt0MiklTU9EOwp9CnNpZ25lZCBtYWluKCl7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKICAgIGNpbiA+PiBuID4+IGs7CiAgICB1cGRhdGUoMSwgMSwgbiwgMSwgMSwgMSk7CiAgICBmb3IoaW50IGkgPSAxOyBpPD1uOyBpKyspewogICAgICAgIGxsIHZhbCA9IGdldCgxLCAxLCBuLCBpLCBpKTsKICAgICAgICB1cGRhdGUoMSwgMSwgbiwgaSsxLCBtaW4obiwgaStrKSwgdmFsKTsKICAgIH0KICAgIGNvdXQgPDwgZ2V0KDEsIDEsIG4sIG4sIG4pOwp9