#include <bits/stdc++.h>
using namespace std;
const int P = 1e9 + 7, N = 205, S = 6;
vector<int> pat;
void pp(int &x, int d) {
  x += d;
  if (x >= P) x -= P;
}
int dp[1 << 16][13];
void Dp(int s) {
  memset(dp, 0, sizeof(dp));
  dp[s][0] = 1;
  for (auto mask : pat) {
    for (int i = (1 << 16) - 1; i >= 0; --i)
      for (int j = 12; j >= 0; --j)
        if (dp[i][j] && (i & mask) == 0) pp(dp[i | mask][j + 1], dp[i][j]);
  }
}
int n, K, f[N][S], g[N][S], to[1 << 16];
const int MaxT = 200;
int u[MaxT], v[MaxT], add[MaxT], way[MaxT], _;
map<pair<pair<int, int>, int>, int> Mp;
void load(int a, int b, int c, int d) {
  u[_] = a, v[_] = b, add[_] = c, way[_++] = d;
}
void Prepare() {
  load(0, 0, 0, 1);
  load(0, 1, 1, 16);
  load(0, 1, 2, 12);
  load(0, 1, 3, 4);
  load(0, 2, 1, 8);
  load(0, 2, 2, 80);
  load(0, 2, 3, 120);
  load(0, 2, 4, 84);
  load(0, 2, 5, 28);
  load(0, 2, 6, 4);
  load(0, 3, 2, 68);
  load(0, 3, 3, 452);
  load(0, 3, 4, 920);
  load(0, 3, 5, 968);
  load(0, 3, 6, 592);
  load(0, 3, 7, 216);
  load(0, 3, 8, 44);
  load(0, 3, 9, 4);
  load(0, 4, 2, 8);
  load(0, 4, 3, 180);
  load(0, 4, 4, 901);
  load(0, 4, 5, 2088);
  load(0, 4, 6, 2802);
  load(0, 4, 7, 2384);
  load(0, 4, 8, 1334);
  load(0, 4, 9, 492);
  load(0, 4, 10, 116);
  load(0, 4, 11, 16);
  load(0, 4, 12, 1);
  load(0, 5, 2, 32);
  load(0, 5, 3, 48);
  load(0, 5, 4, 34);
  load(0, 5, 5, 12);
  load(0, 5, 6, 2);
  load(1, 1, 0, 1);
  load(1, 1, 1, 3);
  load(1, 1, 2, 3);
  load(1, 1, 3, 1);
  load(1, 2, 1, 10);
  load(1, 2, 2, 38);
  load(1, 2, 3, 56);
  load(1, 2, 4, 40);
  load(1, 2, 5, 14);
  load(1, 2, 6, 2);
  load(1, 3, 1, 4);
  load(1, 3, 2, 87);
  load(1, 3, 3, 355);
  load(1, 3, 4, 661);
  load(1, 3, 5, 687);
  load(1, 3, 6, 427);
  load(1, 3, 7, 159);
  load(1, 3, 8, 33);
  load(1, 3, 9, 3);
  load(1, 4, 2, 21);
  load(1, 4, 3, 236);
  load(1, 4, 4, 958);
  load(1, 4, 5, 2058);
  load(1, 4, 6, 2694);
  load(1, 4, 7, 2288);
  load(1, 4, 8, 1291);
  load(1, 4, 9, 482);
  load(1, 4, 10, 115);
  load(1, 4, 11, 16);
  load(1, 4, 12, 1);
  load(1, 5, 1, 4);
  load(1, 5, 2, 15);
  load(1, 5, 3, 22);
  load(1, 5, 4, 16);
  load(1, 5, 5, 6);
  load(1, 5, 6, 1);
  load(2, 2, 0, 1);
  load(2, 2, 1, 7);
  load(2, 2, 2, 19);
  load(2, 2, 3, 26);
  load(2, 2, 4, 19);
  load(2, 2, 5, 7);
  load(2, 2, 6, 1);
  load(2, 3, 1, 10);
  load(2, 3, 2, 78);
  load(2, 3, 3, 248);
  load(2, 3, 4, 426);
  load(2, 3, 5, 436);
  load(2, 3, 6, 274);
  load(2, 3, 7, 104);
  load(2, 3, 8, 22);
  load(2, 3, 9, 2);
  load(2, 4, 1, 2);
  load(2, 4, 2, 45);
  load(2, 4, 3, 306);
  load(2, 4, 4, 1030);
  load(2, 4, 5, 2046);
  load(2, 4, 6, 2601);
  load(2, 4, 7, 2198);
  load(2, 4, 8, 1249);
  load(2, 4, 9, 472);
  load(2, 4, 10, 114);
  load(2, 4, 11, 16);
  load(2, 4, 12, 1);
  load(3, 3, 0, 1);
  load(3, 3, 1, 11);
  load(3, 3, 2, 51);
  load(3, 3, 3, 131);
  load(3, 3, 4, 206);
  load(3, 3, 5, 206);
  load(3, 3, 6, 131);
  load(3, 3, 7, 51);
  load(3, 3, 8, 11);
  load(3, 3, 9, 1);
  load(3, 4, 1, 6);
  load(3, 4, 2, 72);
  load(3, 4, 3, 372);
  load(3, 4, 4, 1093);
  load(3, 4, 5, 2032);
  load(3, 4, 6, 2513);
  load(3, 4, 7, 2112);
  load(3, 4, 8, 1208);
  load(3, 4, 9, 462);
  load(3, 4, 10, 113);
  load(3, 4, 11, 16);
  load(3, 4, 12, 1);
  load(4, 4, 0, 1);
  load(4, 4, 1, 16);
  load(4, 4, 2, 112);
  load(4, 4, 3, 452);
  load(4, 4, 4, 1168);
  load(4, 4, 5, 2032);
  load(4, 4, 6, 2438);
  load(4, 4, 7, 2032);
  load(4, 4, 8, 1168);
  load(4, 4, 9, 452);
  load(4, 4, 10, 112);
  load(4, 4, 11, 16);
  load(4, 4, 12, 1);
  load(5, 3, 1, 12);
  load(5, 3, 2, 84);
  load(5, 3, 3, 252);
  load(5, 3, 4, 422);
  load(5, 3, 5, 430);
  load(5, 3, 6, 272);
  load(5, 3, 7, 104);
  load(5, 3, 8, 22);
  load(5, 3, 9, 2);
  load(5, 4, 2, 36);
  load(5, 4, 3, 288);
  load(5, 4, 4, 1008);
  load(5, 4, 5, 2028);
  load(5, 4, 6, 2592);
  load(5, 4, 7, 2196);
  load(5, 4, 8, 1249);
  load(5, 4, 9, 472);
  load(5, 4, 10, 114);
  load(5, 4, 11, 16);
  load(5, 4, 12, 1);
  load(5, 5, 0, 1);
  load(5, 5, 1, 6);
  load(5, 5, 2, 15);
  load(5, 5, 3, 20);
  load(5, 5, 4, 15);
  load(5, 5, 5, 6);
  load(5, 5, 6, 1);
  f[0][0] = 1;
  f[1][1] = 4, f[1][2] = 4;
  f[2][2] = 4, f[2][3] = 8;
  f[2][4] = 2, f[2][5] = 2;
  f[3][3] = 4, f[3][4] = 4;
  f[4][4] = 1;
  return;
  vector<int> tri;
  for (int i = 0; i < (4); ++i) {
    int mask = 1 << 0 | 1 << 4 | 1 << 8 | 1 << 12;
    tri.push_back(mask << i);
  }
  for (int i = 0; i < (1 << 16); ++i) {
    for (int j = 0; j < (4); ++j)
      if (tri[j] & i) to[i] |= 1 << j;
    if (__builtin_popcount(to[i]) == 2)
      to[i] = (to[i] == 5 || to[i] == 10) ? 5 : 2;
    else
      to[i] = __builtin_popcount(to[i]);
  }
  for (int i = 0; i < (4); ++i)
    pat.push_back(tri[i] | tri[(i + 1) % 4]), pat.push_back(tri[i]);
  Dp(0);
  for (int i = 0; i < (1 << 16); ++i)
    for (int j = 0; j < (13); ++j) pp(f[j][to[i]], dp[i][j]);
  for (int i = 4; i < (16); ++i) pat.push_back(1 << i);
  pat.push_back(1 << 8 | 1 << 15);
  pat.push_back(1 << 9 | 1 << 12);
  pat.push_back(1 << 10 | 1 << 13);
  pat.push_back(1 << 11 | 1 << 14);
  static bool vis[16];
  for (int i = 0; i < (16); ++i)
    if (!vis[to[i]]) {
      Dp(i);
      vis[to[i]] = true;
      for (int j = 0; j < (1 << 16); ++j)
        for (int k = 0; k < (13); ++k)
          if (dp[j][k]) pp(Mp[make_pair(make_pair(to[i], to[j]), k)], dp[j][k]);
    }
  for (auto e : Mp)
    u[_] = e.first.first.first, v[_] = e.first.first.second,
    add[_] = e.first.second, way[_++] = e.second;
}
int main() {
  Prepare();
  int n, K;
  scanf("%d%d", &n, &K);
  for (int i = 0; i < (n); ++i) {
    memset(g, 0, sizeof(g));
    for (int j = 0; j < (K + 1); ++j)
      for (int k = 0; k < (_); ++k)
        if (j + add[k] <= K)
          pp(g[j + add[k]][v[k]], 1ll * f[j][u[k]] * way[k] % P);
    memcpy(f, g, sizeof(f));
  }
  int ans = 0;
  for (int k = 0; k < (S); ++k) pp(ans, f[K][k]);
  for (int i = 1; i < (K + 1); ++i) ans = 1ll * ans * i % P;
  printf("%d\n", ans);
  return 0;
}
