#pragma GCC optimize("O3,unroll-loops")
#include <bits/stdc++.h>
#define ll long long
#define int long long
#define itachi ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
using namespace std;
const int MOD = 1000000007;
const int MAXN = 1005;
const int MAXMASK = 1 << 13; // vì k <= 6 → 2k+1 <= 13
int n, k;
int L;
ll dp[MAXN][MAXMASK];
int add(int a, int b){
a += b;
if(a >= MOD) a -= MOD;
return a;
}
signed main(){
itachi;
cin >> n >> k;
L = 2 * k + 1;
int FULL = (1 << L) - 1;
/* ======================
Khởi tạo dp[0][mask]
Cửa sổ ban đầu: [1-k , 1+k]
Các số <1 hoặc >n coi như đã dùng
====================== */
int init_mask = 0;
for(int t = 0; t < L; t++){
int val = 1 - k + t;
if(val < 1 || val > n)
init_mask |= (1 << t);
}
dp[0][init_mask] = 1;
/* ======================
DP theo vị trí
====================== */
for(int i = 1; i <= n; i++){
int start = i - k; // đầu cửa sổ
for(int mask = 0; mask < (1 << L); mask++){
if(dp[i-1][mask] == 0) continue;
// chọn 1 số trong cửa sổ để gán cho vị trí i
for(int t = 0; t < L; t++){
if(mask & (1 << t)) continue;
int val = start + t;
if(val < 1 || val > n) continue;
int nmask = mask | (1 << t);
// số sắp bị đẩy ra ngoài phải đã dùng
if((nmask & 1) == 0) continue;
// dịch cửa sổ
nmask >>= 1;
// thêm số mới vào cửa sổ
if(start + L > n)
nmask |= (1 << (L - 1));
dp[i][nmask] = add(dp[i][nmask], dp[i-1][mask]);
}
}
}
cout << dp[n][FULL];
return 0;
}