// ROOT : DRAGON3012009
#include <bits/stdc++.h>
#define ll int
#define ld long double
#define el "\n"
#define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define __ROOT__ int main()
#pragma GCC optimize("O2")
#define FOR(i,l,r) for(int i = l ; i <= r ; i ++)
#define FORD(i,r,l) for(int i = r ; i >= l ; i --)
#define REP(i, a ) for(int i = 0 ; i < a ; i ++ )
#define fi first
#define se second
#define M 1000007
#define MAXN 100001
#define INF (1ll<<30)
#define BLOCK_SIZE 425
#define MAX_NODE 1001001
#define LOG 19
#define ALPHA_SIZE 26
#define BASE 311
#define NAME "file"
#define compare(v) sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end());
using namespace std;
const ll MOD[] = {(ll)1e9 + 2277, (ll)1e9 + 5277, (ll)1e9 + 8277, (ll)1e9 + 9277, (ll) 1e9 + 7 };
const ll NMOD = 1;
const int dx[] = {-1, 0, 1,0};
const int dy[] = {0, 1, 0, -1};
//**Variable**//
ll n, k ;
ll dp[MAXN][2][101][2] ; // pos - k - ma ;
//**Struct**//
//**Function**//
template<class X, class Y >
bool minimize(X & x, const Y &y ) {
if(x > y ) {
x = y ;
return true ;
} else return false;
}
template<class X, class Y >
bool maximize(X &x, const Y &y ) {
if(x < y ) {
x = y ;
return true;
} else return false ;
}
ll add(ll a, ll b ) {
return (a + b ) % M;
}
ll DP(ll pos,ll last, ll cnt, ll ok ) {
if(pos < 0 ) return 0 ;
ll &cur = dp[pos][last][cnt][ok] ;
if(pos == 0 ) {
return cur = (cnt >= k || ok) ;
}
if(cur != -1 ) return cur ;
cur = 0 ;
if(cnt >= k || ok ) {
cur =add(cur, DP(pos - 1, 0, 0, 1)) ;
cur= add(cur, DP(pos -1,1,cnt, 1) ) ;
} else {
cur = add(cur, DP(pos - 1, 0, 0,ok ) ) ;
cur = add(DP(pos - 1, 1, cnt + 1, ok ), cur ) ;
}
return cur % M ;
}
void init() {
cin>>n>> k ;
memset(dp, -1, sizeof dp ) ;
}
void solve() {
cout << DP(n, 0, 0, 0 ) ;
}
__ROOT__ {
// freopen(NAME".inp" , "r" , stdin);
// freopen(NAME".out" , "w", stdout) ;
fast;
init();
solve();
}
Ly8gUk9PVCA6IERSQUdPTjMwMTIwMDkKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgaW50CiNkZWZpbmUgbGQgbG9uZyBkb3VibGUKI2RlZmluZSBlbCAiXG4iCiNkZWZpbmUgZmFzdCBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKI2RlZmluZSBfX1JPT1RfXyBpbnQgbWFpbigpCiNwcmFnbWEgR0NDIG9wdGltaXplKCJPMiIpCiNkZWZpbmUgRk9SKGksbCxyKSBmb3IoaW50IGkgPSBsIDsgaSA8PSByIDsgaSArKykKI2RlZmluZSBGT1JEKGkscixsKSBmb3IoaW50IGkgPSByIDsgaSA+PSBsIDsgaSAtLSkKI2RlZmluZSBSRVAoaSwgYSApIGZvcihpbnQgaSA9IDAgOyBpIDwgYSA7IGkgKysgKQojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgTSAxMDAwMDA3CiNkZWZpbmUgTUFYTiAxMDAwMDEKI2RlZmluZSBJTkYgKDFsbDw8MzApCiNkZWZpbmUgQkxPQ0tfU0laRSA0MjUKI2RlZmluZSBNQVhfTk9ERSAxMDAxMDAxCiNkZWZpbmUgTE9HIDE5CiNkZWZpbmUgQUxQSEFfU0laRSAyNgojZGVmaW5lIEJBU0UgMzExCiNkZWZpbmUgTkFNRSAiZmlsZSIKI2RlZmluZSBjb21wYXJlKHYpIHNvcnQoKHYpLmJlZ2luKCksICh2KS5lbmQoKSk7ICh2KS5lcmFzZSh1bmlxdWUoKHYpLmJlZ2luKCksICh2KS5lbmQoKSksICh2KS5lbmQoKSk7CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNvbnN0IGxsIE1PRFtdID0geyhsbCkxZTkgKyAyMjc3LCAobGwpMWU5ICsgNTI3NywgKGxsKTFlOSArIDgyNzcsIChsbCkxZTkgKyA5Mjc3LCAobGwpIDFlOSArIDcgfTsKY29uc3QgbGwgTk1PRCA9IDE7CmNvbnN0IGludCBkeFtdID0gey0xLCAwLCAxLDB9Owpjb25zdCBpbnQgZHlbXSA9IHswLCAxLCAwLCAtMX07Ci8vKipWYXJpYWJsZSoqLy8KbGwgbiwgayAgIDsKbGwgZHBbTUFYTl1bMl1bMTAxXVsyXSAgOyAvLyBwb3MgLSBrIC0gbWEgIDsKLy8qKlN0cnVjdCoqLy8KCi8vKipGdW5jdGlvbioqLy8KdGVtcGxhdGU8Y2xhc3MgWCwgY2xhc3MgWSA+CmJvb2wgbWluaW1pemUoWCAmIHgsIGNvbnN0IFkgJnkgKSB7CiAgICBpZih4ID4geSApIHsKICAgICAgICB4ID0geSA7CiAgICAgICAgcmV0dXJuIHRydWUgOwogICAgfSBlbHNlIHJldHVybiBmYWxzZTsKfQp0ZW1wbGF0ZTxjbGFzcyBYLCBjbGFzcyBZID4KYm9vbCBtYXhpbWl6ZShYICZ4LCBjb25zdCBZICZ5ICkgewogICAgaWYoeCA8IHkgICkgewogICAgICAgIHggPSB5ICA7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgcmV0dXJuIGZhbHNlIDsKfQpsbCBhZGQobGwgYSwgbGwgYiApIHsKICAgIHJldHVybiAoYSArIGIgKSAlIE07Cn0KbGwgRFAobGwgcG9zLGxsIGxhc3QsIGxsIGNudCwgbGwgb2sgKSB7CiAgICBpZihwb3MgPCAwICkgcmV0dXJuIDAgOwogICAgbGwgJmN1ciA9IGRwW3Bvc11bbGFzdF1bY250XVtva10gOwogICAgaWYocG9zID09IDAgKSB7CiAgICAgICAgcmV0dXJuIGN1ciA9IChjbnQgPj0gayB8fCBvaykgOwogICAgfQogICAgaWYoY3VyICE9IC0xICkgcmV0dXJuIGN1ciA7CiAgICBjdXIgPSAwIDsKICAgIGlmKGNudCA+PSBrICB8fCBvayApIHsKICAgICAgICBjdXIgPWFkZChjdXIsIERQKHBvcyAtIDEsIDAsIDAsIDEpKSAgOwogICAgICAgIGN1cj0gYWRkKGN1ciwgRFAocG9zIC0xLDEsY250LCAxKSApIDsKICAgIH0gZWxzZSB7CiAgICAgICAgY3VyID0gYWRkKGN1ciwgRFAocG9zIC0gMSwgMCwgMCxvayApICkgICA7CiAgICAgICAgY3VyID0gYWRkKERQKHBvcyAtIDEsIDEsIGNudCArIDEsIG9rICksIGN1ciApICA7CiAgICB9CiAgICByZXR1cm4gY3VyICAlIE0gOwp9CnZvaWQgaW5pdCgpIHsKICAgIGNpbj4+bj4+IGsgOwogICAgbWVtc2V0KGRwLCAtMSwgc2l6ZW9mIGRwICApIDsKfQoKdm9pZCBzb2x2ZSgpIHsKICAgIGNvdXQgPDwgRFAobiwgMCwgMCwgMCApIDsKfQoKX19ST09UX18gewovLyAgICAgZnJlb3BlbihOQU1FIi5pbnAiICwgInIiICwgc3RkaW4pOwovLyAgICAgZnJlb3BlbihOQU1FIi5vdXQiICwgInciLCBzdGRvdXQpIDsKICAgIGZhc3Q7CiAgICBpbml0KCk7CiAgICBzb2x2ZSgpOwp9Cg==