#include <bits/stdc++.h>   using namespace std;   template <class T>   inline void checkmin(T &a, const T &b) {     if (b < a) a = b;   }   template <class T>   inline void checkmax(T &a, const T &b) {     if (b > a) a = b;   }   const int maxn = 1e3 + 10;   const int inf = 1e9 + 10;   const long long mod = 1e9 + 7;   int dp[maxn][maxn][4], g[maxn];   int n, k;   long long fac[maxn], c[maxn][maxn];   int main() {     scanf( %d%d , &n, &k);     dp[0][0][2] = 1;     for (int i = 0; i < n; i++)       for (int j = 0; j <= n; j++)         for (int mask = 0; mask < 4; mask++) {           if (dp[i][j][mask] == 0) continue;           int mask2 = (mask & 1) << 1;           dp[i + 1][j][mask2] += dp[i][j][mask];           dp[i + 1][j][mask2] %= mod;           if (!((mask >> 1) & 1))             dp[i + 1][j + 1][mask2] += dp[i][j][mask],                 dp[i + 1][j + 1][mask2] %= mod;           if (i == n - 1) continue;           mask2 |= 1;           dp[i + 1][j + 1][mask2] += dp[i][j][mask];           dp[i + 1][j + 1][mask2] %= mod;         }     fac[0] = 1;     for (long long i = 1; i < maxn; i++) fac[i] = fac[i - 1] * i % mod;     for (int i = k; i <= n; i++) {       long long now = 0;       for (int mask = 0; mask < 4; mask++) now += dp[n][i][mask], now %= mod;       g[i] = now * fac[n - i] % mod;     }     c[0][0] = 1;     for (int i = 1; i < maxn; i++) {       c[i][0] = 1;       for (int j = 1; j <= i; j++)         c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mod;     }     long long ans = 0;     for (int i = k; i <= n; i++) {       if ((i - k) & 1)         ans -= c[i][k] * g[i] % mod, ans += mod;       else         ans += c[i][k] * g[i] % mod;       ans %= mod;     }     printf( %d n , ans);     return 0;   }   