// UUID: 708a2b2e-48c1-4354-94dc-9b769051bdd3
#include <bits/stdc++.h>
using namespace std;
const long long mod = (int)1e9+7;
const int maxn = 3005;
long long fakt[maxn], inv[maxn], lefed[maxn][2], dp[maxn][2];
long long hatvany(long long x, long long h){
return h ? (h & 1ll ? hatvany(x*x%mod, h>>1)*x%mod : hatvany(x*x%mod, h>>1)) : 1ll;
}
long long komb(int n, int k){
if(n < 0 || n < k || k < 0) return 0;
return fakt[n]*(inv[k]*inv[n-k]%mod)%mod;
}
int main(){
fakt[0] = 1;
for(int i = 1; i < maxn; i++)
fakt[i] = fakt[i-1] * i % mod;
inv[maxn-1] = hatvany(fakt[maxn-1], mod-2);
for(int i = maxn-2; i >= 0; i--)
inv[i] = inv[i+1]*(i+1)%mod;
int n, k;
cin>>n>>k;
if(k+1 >= n){
cout<<fakt[n]<<'\n';
return 0;
}
lefed[n-k][0] = 1;
for(int i = n-k+1; i <= n; i++){
for(int j = max(0, i-n+k+1); j < i; j++){
lefed[i][0] = (lefed[i][0] + lefed[j][1])%mod;
lefed[i][1] = (lefed[i][1] + lefed[j][0])%mod;
}
}
dp[0][1] = 1;
for(int i = 1; i <= n; i++){
dp[i][0] = dp[i-1][0] * i % mod;
dp[i][1] = dp[i-1][1] * i % mod;
for(int j = 0; j <= i-n+k; j++){
long long x = komb(i, i-j);
dp[i][0] = (dp[i][0] + (dp[j][0] * lefed[i-j][1] %mod) * x + (dp[j][1] * lefed[i-j][0] %mod) * x) % mod;
dp[i][1] = (dp[i][1] + (dp[j][0] * lefed[i-j][0] %mod) * x + (dp[j][1] * lefed[i-j][1] %mod) * x) % mod;
}
}
cout<<(dp[n][0] - dp[n][1] + fakt[n] + mod)%mod<<'\n';
return 0;
}