#include <bits/stdc++.h>
using namespace std;
const int mod = 1000000007;
inline int add(int a, int b) {
  if ((a += b) >= mod) a -= mod;
  return a;
}
inline int mult(int a, int b) {
  long long t = 1ll * a * b;
  if (t >= mod) t %= mod;
  return t;
}
int dp[210][210][16];
int n, K;
vector<int> trans;
int adding[16][210][16];
void transform(int pos, int ncnt, int cur, int S0) {
  if (pos == trans.size()) {
    int S = S0;
    for (int j = 0; j < 12; j++)
      if ((cur >> j) & 1) S |= (1 << (j / 3));
    adding[S0][ncnt][S | S0] = add(adding[S0][ncnt][S | S0], 1);
    return;
  }
  int v = trans[pos], c = __builtin_popcount(v);
  if (c <= 2) {
    if (!(cur & v)) transform(pos + 1, ncnt + 1, cur | v, S0);
  } else if (c == 3) {
    int p = pos - 16;
    if (!(cur & v) && !((S0 >> p) & 1))
      transform(pos + 1, ncnt + 1, cur | v, S0);
  } else {
    int p = pos - 20;
    if (!(cur & v) && !((S0 >> p) & 1) && !((S0 >> ((p + 1) % 4)) & 1))
      transform(pos + 1, ncnt + 1, cur | v, S0);
  }
  transform(pos + 1, ncnt, cur, S0);
}
int main() {
  int fac = 1;
  scanf("%d%d", &n, &K);
  for (int i = 1; i <= K; i++) fac = mult(fac, i);
  dp[0][0][0] = 1;
  dp[0][1][1] = dp[0][1][2] = dp[0][1][4] = dp[0][1][8] = 1;
  dp[0][1][3] = dp[0][1][6] = dp[0][1][12] = dp[0][1][9] = 1;
  for (int i = 0; i < 4; i++) {
    for (int j = i + 1; j < 4; j++) {
      dp[0][2][(1 << i) | (1 << j)] = 1;
      for (int k = j + 1; k < 4; k++) {
        dp[0][3][(1 << i) | (1 << j) | (1 << k)] = 1;
        dp[0][2][(1 << i) | (1 << j) | (1 << k)] = 2;
      }
    }
  }
  dp[0][4][15] = 1;
  dp[0][3][15] = 4;
  dp[0][2][15] = 2;
  for (int i = 0; i < 12; i++) trans.push_back((1 << i));
  trans.push_back(1 | (1 << 11));
  trans.push_back((1 << 2) | (1 << 3));
  trans.push_back((1 << 5) | (1 << 6));
  trans.push_back((1 << 8) | (1 << 9));
  for (int i = 0; i < 4; i++) trans.push_back(7 << (i * 3));
  for (int i = 0; i < 4; i++)
    trans.push_back((7 << (i * 3)) | (7 << (((i + 1) % 4) * 3)));
  for (int i = 0; i < 16; i++) transform(0, 0, 0, i);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j <= K; j++) {
      for (int k = 0; k < 16; k++) {
        if (dp[i][j][k]) {
          for (int l = 0; l + j <= K && l <= 12; l++) {
            for (int S = 0; S < 16; S++)
              dp[i + 1][j + l][S] =
                  add(dp[i + 1][j + l][S], mult(dp[i][j][k], adding[k][l][S]));
          }
        }
      }
    }
  }
  int ans = 0;
  for (int i = 0; i < 16; i++) ans = add(ans, dp[n][K][i]);
  printf("%d\n", mult(ans, fac));
  return 0;
}
