#include<bits/stdc++.h>
#define taskname "A"
using namespace std;
typedef long long ll;
const int lim = 1e5 + 5;
const int mod = 1e9 + 7;
int power(int a, int b){
int ans = 1;
for(; b > 0; b >>= 1, a = ll(a) * a % mod){
if(b & 1){
ans = ll(ans) * a % mod;
}
}
return ans;
}
void add(int& a, int b){
if((a += b) >= mod){
a -= mod;
}
}
void sub(int& a, int b){
if((a -= b) < 0){
a += mod;
}
}
int n, k, gt[lim], igt[lim];
int Ckn(int k, int n){
return ll(gt[n]) * igt[k] % mod * igt[n - k] % mod;
}
namespace sub1{
void solve(){
vector<int>p(n);
iota(p.begin(), p.end(), 0);
int ans = 0;
do{
int cnt = 0;
for(int i = 1; i < n; i++){
if(p[i] < p[i - 1]){
cnt++;
}
}
if(cnt == k){
ans++;
}
} while(next_permutation(p.begin(), p.end()));
cout << ans;
}
}
namespace sub23{
void solve(){
vector<int>f(n + 1, 0);
for(int i = f[0] = 1; i < n; i++){
vector<int>nf(n + 1, 0);
for(int j = 0; j <= n; j++){
if(f[j] > 0){
add(nf[j], f[j]);
add(nf[j], ll(j) * f[j] % mod);
add(nf[j + 1], f[j]);
add(nf[j + 1], ll(i - j - 1) * f[j] % mod);
}
}
swap(f, nf);
}
cout << f[k];
}
}
namespace sub4{
void solve(){
int ans = 0;
for(int i = 0; i <= k; i++){
if(i & 1){
sub(ans, ll(Ckn(i, n + 1)) * power(k + 1 - i, n) % mod);
}
else{
add(ans, ll(Ckn(i, n + 1)) * power(k + 1 - i, n) % mod);
}
}
cout << ans;
}
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
if(fopen(taskname".inp", "r")){
freopen(taskname".inp", "r", stdin);
}
for(int i = gt[0] = igt[0] = igt[1] = 1; i < lim; i++){
gt[i] = ll(gt[i - 1]) * i % mod;
}
igt[lim - 1] = power(gt[lim - 1], mod - 2);
for(int i = lim - 2; i > 1; i--){
igt[i] = ll(igt[i + 1]) * (i + 1) % mod;
}
cin >> n >> k;
if(k-- == 1){
return cout << 1, 0;
}
if(n <= 10){
sub1::solve();
}
else if(n <= 3000){
sub23::solve();
}
else{
sub4::solve();
}
}