#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;
}
