#include <bits/stdc++.h>   using namespace std;   const long long inf = 1000000007;   long long a[1100][1100];   long long b[1100][1100];   long long A(int n, int k);   long long B(int n, int k);   long long A(int n, int k) {     if (a[n][k] != -1) {       return a[n][k];     }     if (n < k) {       return a[n][k] = 0;     }     if (n == 1) {       return a[n][k] = (k == 0);     }     if (n == 2) {       return a[n][k] = (k != 1);     }     long long ret = A(n - 1, k);     ret += A(n - 1, k + 1) * (k + 1) - B(n - 1, k + 1) + B(n - 1, k) -            B(n - 1, k + 1) + B(n - 1, k);     ret += A(n - 1, k) * (n - 1 - k);     ret -= A(n - 1, k) - A(n - 2, k) - B(n - 1, k);     if (k > 0) {       ret += A(n - 1, k - 1) - A(n - 2, k - 1) - B(n - 1, k - 1);     }     ret -= A(n - 1, k) - A(n - 2, k) - B(n - 1, k);     if (k > 0) {       ret += A(n - 1, k - 1) - A(n - 2, k - 1) - B(n - 1, k - 1);     }     ret -= A(n - 2, k);     if (k > 1) {       ret += A(n - 2, k - 2);     }     return a[n][k] = (ret % inf + inf) % inf;   }   long long B(int n, int k) {     if (b[n][k] != -1) {       return b[n][k];     }     if (n < k) {       return (b[n][k] = 0);     }     if (n == 1) {       return b[n][k] = 0;     }     if (n == 2) {       return b[n][k] = (k == 2);     }     if (k == 0) {       return b[n][k] = 0;     }     if (k == 1) {       return b[n][k] =                  ((A(n - 1, 0) - A(n - 2, 0) + B(n - 1, 1)) % inf + inf) % inf;     }     return b[n][k] = (A(n - 2, k - 2) + B(n - 1, k) + A(n - 1, k - 1) -                       B(n - 1, k - 1) - A(n - 2, k - 1)) %                      inf;   }   int main() {     memset(a, -1, sizeof(a));     memset(b, -1, sizeof(b));     int n, k;     cin >> n >> k;     cout << A(n, k) << endl;     return 0;   }   