#include <bits/stdc++.h>   using namespace std;   int Read() {     char c;     while (c = getchar(), (c !=  - ) && (c <  0  || c >  9 ))       ;     bool neg = (c ==  - );     int ret = neg ? 0 : c - 48;     while (c = getchar(), c >=  0  && c <=  9 ) ret = ret * 10 + c - 48;     return neg ? -ret : ret;   }   const int MAXN = 205, MOD = 7 + 1e9;   int g1[13], g2[10], g3[7], g4[4], fac[MAXN];   int T, N, K, c[15][15], f1[MAXN][MAXN], f2[MAXN][MAXN], f3[MAXN][MAXN],       f4[MAXN][MAXN];   int h2[MAXN][MAXN], h3[MAXN][MAXN], h4[MAXN][MAXN];   void init() {     for (int i = 0; i <= 12; i++) c[i][0] = 1;     for (int i = 1; i <= 12; i++)       for (int j = 1; j <= i; j++)         c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % MOD;     g1[0] = g2[0] = g3[0] = g4[0] = 1;     for (int i = 1; i <= 12; i++) {       g1[i] = c[12][i] + 4 * c[10][i - 1];       if (i > 1) g1[i] += 6 * c[8][i - 2];       if (i > 2) g1[i] += 4 * c[6][i - 3];       if (i > 3) g1[i] += c[4][i - 4];     }     for (int i = 1; i <= 9; i++) {       g2[i] = c[9][i] + 2 * c[7][i - 1];       if (i > 1) g2[i] += c[5][i - 2];     }     for (int i = 1; i <= 6; i++) g3[i] = c[6][i] + c[4][i - 1];     for (int i = 1; i <= 3; i++) g4[i] = c[3][i];     f1[0][0] = f2[0][0] = f3[0][0] = f4[0][0] = 1;     f1[0][1] = 8, f1[0][2] = 16, f1[0][3] = 8, f1[0][4] = 1;     f2[0][1] = 5, f2[0][2] = 5, f2[0][3] = 1;     f3[0][1] = 3, f3[0][2] = 1;     f4[0][1] = 1;     for (int i = 1; i <= 200; i++) {       for (int j = 0; j <= 200; j++) {         for (int k = 0; k <= 3; k++)           if (j >= k)             (f4[i][j] += (long long)f4[i - 1][j - k] * g4[k] % MOD) %= MOD;         h4[i][j] = f4[i][j];       }       (f4[i][1] += 1) % MOD;       for (int j = 0; j <= 200; j++) {         for (int k = 0; k <= 6; k++)           if (j >= k)             (f3[i][j] += (long long)f3[i - 1][j - k] * g3[k] % MOD) %= MOD;         h3[i][j] = f3[i][j];         if (j) (f3[i][j] += (long long)h4[i][j - 1] * 2LL % MOD) %= MOD;       }       (f3[i][2] += 1) %= MOD;       (f3[i][1] += 1) %= MOD;       for (int j = 0; j <= 200; j++) {         for (int k = 0; k <= 9; k++)           if (j >= k)             (f2[i][j] += (long long)f2[i - 1][j - k] * g2[k] % MOD) %= MOD;         h2[i][j] = f2[i][j];         if (j) {           (f2[i][j] += (long long)h3[i][j - 1] * 2LL % MOD) %= MOD;           for (int k = 0; k <= j - 1; k++)             (f2[i][j] +=              (long long)h4[i][k] * (long long)h4[i][j - k - 1] % MOD) %= MOD;         }         if (j > 1) (f2[i][j] += (long long)h4[i][j - 2] * 3LL % MOD) %= MOD;         if (j) (f2[i][j] += (long long)h4[i][j - 1] * 2LL % MOD) %= MOD;       }       (f2[i][3] += 1) %= MOD;       (f2[i][2] += 2) %= MOD;       for (int j = 0; j <= 200; j++) {         for (int k = 0; k <= 12; k++)           if (j >= k)             (f1[i][j] += (long long)f1[i - 1][j - k] * g1[k] % MOD) %= MOD;         if (j) (f1[i][j] += (long long)h2[i][j - 1] * 4LL % MOD) %= MOD;         if (j > 1) {           (f1[i][j] += (long long)h3[i][j - 2] * 4LL % MOD) %= MOD;           for (int k = 0; k <= j - 2; k++)             (f1[i][j] += (long long)h4[i][k] * (long long)h4[i][j - k - 2] % MOD *                          2LL % MOD) %= MOD;         }         if (j > 2) (f1[i][j] += (long long)h4[i][j - 3] * 4LL % MOD) %= MOD;         if (j) (f1[i][j] += (long long)h3[i][j - 1] * 4LL % MOD) %= MOD;         if (j > 1) (f1[i][j] += (long long)h4[i][j - 2] * 8LL % MOD) %= MOD;       }       (f1[i][2] += 2) %= MOD;       (f1[i][3] += 4) %= MOD;       (f1[i][4] += 1) %= MOD;     }     fac[0] = 1;     for (int i = 1; i <= 200; i++) fac[i] = (long long)fac[i - 1] * i % MOD;   }   void work() {     scanf( %d%d , &N, &K);     printf( %d n , (int)((long long)f1[N][K] * fac[K] % MOD));   }   int main() {     init();     work();     return 0;   }