func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long mod = 1e9 + 7, maxn = 2e3 + 5;   long long f[maxn][maxn][2][2];   long long g[maxn];   long long n, m;   long long upd(const long long &x) {     if (x < 0) return x + mod;     if (x >= mod) return x - mod;     return x;   }   void add(long long &x, const long long &y) { x = upd(x + upd(y)); }   long long jc[maxn], inv[maxn];   long long ksm(long long x, long long k) {     long long ans = 1;     while (k) {       if (k & 1) ans = ans * x % mod;       x = x * x % mod;       k >>= 1;     }     return ans;   }   void init(long long n) {     jc[0] = 1;     for (long long i(1), endi(n); i <= endi; i++) jc[i] = jc[i - 1] * i % mod;     inv[n] = ksm(jc[n], mod - 2);     for (long long i(n - 1), endi(0); i >= endi; i--)       inv[i] = inv[i + 1] * (i + 1) % mod;   }   long long C(long long n, long long m) {     if (n < 0 || m < 0 || n < m) return 0;     return jc[n] * inv[m] % mod * inv[n - m] % mod;   }   signed main() {     scanf( %lld%lld , &n, &m);     init(n);     f[1][0][0][0] = 1;     f[1][1][0][1] = 1;     for (long long i(2), endi(n); i <= endi; i++)       for (long long j(0), endj(n); j <= endj; j++) {         if (j) {           add(f[i][j][0][0], f[i - 1][j - 1][0][0]);           add(f[i][j][1][0], f[i - 1][j - 1][0][1]);           if (i != n) {             add(f[i][j][0][1], f[i - 1][j - 1][0][0] + f[i - 1][j - 1][1][0]);             add(f[i][j][1][1], f[i - 1][j - 1][0][1] + f[i - 1][j - 1][1][1]);           }         }         add(f[i][j][0][0], f[i - 1][j][0][0] + f[i - 1][j][1][0]);         add(f[i][j][1][0], f[i - 1][j][0][1] + f[i - 1][j][1][1]);       }     for (long long i(0), endi(n); i <= endi; i++) {       add(g[i], f[n][i][0][0] + f[n][i][1][0]);       g[i] = g[i] * jc[n - i] % mod;     }     long long ans = 0;     for (long long i(m), endi(n); i <= endi; i++) {       add(ans, ((i - m) & 1 ? -1 : 1) * g[i] * C(i, m) % mod);     }     cout << ans;     return 0;   }   