#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
int N, K;
int P[202][202][6][2];
int dig[1 << 12], tot[6][15], totsec[4][6][15];
bool okn[6][1 << 12];
inline void add(int& x, long long y) {
  x += y % MOD;
  if (x >= MOD) x -= MOD;
}
int getDP(int size, int trng, int state, bool period) {
  if (trng < 0) return 0;
  if (trng == 0) return 1;
  if (state == 4) return 0;
  if (size == 0 && period) return 0;
  int& now = P[size][trng][state][period];
  if (now != -1) return now;
  now = 0;
  if (period == false) {
    if (state == 0) {
      add(now, getDP(size, trng, 0, true));
      add(now, 4LL * getDP(size, trng - 1, 1, true));
      add(now, 4LL * getDP(size, trng - 1, 2, true));
      add(now, 4LL * getDP(size, trng - 2, 2, true));
      add(now, 8LL * getDP(size, trng - 2, 3, true));
      add(now, 4LL * getDP(size, trng - 3, 3, true));
      add(now, 2LL * getDP(size, trng - 2, 4, true));
      add(now, 4LL * getDP(size, trng - 3, 4, true));
      add(now, getDP(size, trng - 4, 4, true));
      add(now, 2LL * getDP(size, trng - 2, 5, true));
    } else if (state == 1) {
      add(now, getDP(size, trng, 1, true));
      add(now, 2LL * getDP(size, trng - 1, 2, true));
      add(now, 2LL * getDP(size, trng - 1, 3, true));
      add(now, 3LL * getDP(size, trng - 2, 3, true));
      add(now, 2LL * getDP(size, trng - 2, 4, true));
      add(now, getDP(size, trng - 3, 4, true));
      add(now, getDP(size, trng - 1, 5, true));
    } else if (state == 2) {
      add(now, getDP(size, trng, 2, true));
      add(now, 2LL * getDP(size, trng - 1, 3, true));
      add(now, getDP(size, trng - 1, 4, true));
      add(now, getDP(size, trng - 2, 4, true));
    } else if (state == 3) {
      add(now, getDP(size, trng, 3, true));
      add(now, getDP(size, trng - 1, 4, true));
    } else if (state == 5) {
      add(now, getDP(size, trng, 5, true));
      add(now, 2LL * getDP(size, trng - 1, 3, true));
      add(now, getDP(size, trng - 2, 4, true));
    }
  } else {
    add(now, getDP(size - 1, trng, state, false));
    if (state == 0) {
      for (int i = 1; i <= 4 && i <= trng; ++i)
        for (int j = 0; j <= min(12, trng); ++j) {
          int total = j;
          if (i == 1)
            add(now, tot[i][j] * 4LL * getDP(size - 1, trng - total, 0, false));
          else if (i == 2)
            add(now, tot[i][j] * 6LL * getDP(size - 1, trng - total, 0, false));
          else if (i == 3)
            add(now, tot[i][j] * 4LL * getDP(size - 1, trng - total, 0, false));
          else if (i == 4)
            add(now, tot[i][j] * 1LL * getDP(size - 1, trng - total, 0, false));
        }
      for (int i = 1; i <= 4 && i <= trng; ++i)
        for (int j = 0; j <= min(12, trng); ++j) {
          int total = j;
          if (i == 1)
            add(now, totsec[0][i][j] * 4LL *
                         getDP(size - 1, trng - total, 0, false));
          else if (i == 2)
            add(now, totsec[0][i][j] * 6LL *
                         getDP(size - 1, trng - total, 0, false));
          else if (i == 3)
            add(now, totsec[0][i][j] * 4LL *
                         getDP(size - 1, trng - total, 0, false));
          else if (i == 4)
            add(now, totsec[0][i][j] * 1LL *
                         getDP(size - 1, trng - total, 0, false));
        }
    } else if (state == 1) {
      for (int i = 1; i <= 3 && i <= trng; ++i)
        for (int j = 0; j <= min(12, trng); ++j) {
          int total = j;
          if (i == 1)
            add(now, tot[i][j] * 3LL * getDP(size - 1, trng - total, 1, false));
          else if (i == 2)
            add(now, tot[i][j] * 3LL * getDP(size - 1, trng - total, 1, false));
          else if (i == 3)
            add(now, tot[i][j] * 1LL * getDP(size - 1, trng - total, 1, false));
        }
      for (int i = 1; i <= 2 && i <= trng; ++i)
        for (int j = 0; j <= min(12, trng); ++j) {
          int total = j;
          if (i == 1)
            add(now, totsec[1][i][j] * 2LL *
                         getDP(size - 1, trng - total, 1, false));
          else if (i == 2)
            add(now, totsec[1][i][j] * 1LL *
                         getDP(size - 1, trng - total, 1, false));
        }
    } else if (state == 2) {
      for (int i = 1; i <= 2 && i <= trng; ++i)
        for (int j = 0; j <= min(12, trng); ++j) {
          int total = j;
          if (i == 1)
            add(now, tot[i][j] * 2LL * getDP(size - 1, trng - total, 2, false));
          else if (i == 2)
            add(now, tot[i][j] * 1LL * getDP(size - 1, trng - total, 2, false));
        }
      for (int i = 1; i <= 1 && i <= trng; ++i)
        for (int j = 0; j <= min(12, trng); ++j) {
          int total = j;
          if (i == 1)
            add(now, totsec[2][i][j] * 1LL *
                         getDP(size - 1, trng - total, 2, false));
        }
    } else if (state == 3) {
      for (int i = 1; i <= 1 && i <= trng; ++i)
        for (int j = 0; j <= min(12, trng); ++j) {
          int total = j;
          if (i == 1)
            add(now, tot[i][j] * 1LL * getDP(size - 1, trng - total, 3, false));
        }
    } else if (state == 5) {
      for (int i = 1; i <= 2 && i <= trng; ++i)
        for (int j = 0; j <= min(12, trng); ++j) {
          int total = j;
          if (i == 1)
            add(now, tot[i][j] * 2LL * getDP(size - 1, trng - total, 5, false));
          else if (i == 2)
            add(now, tot[i][j] * 1LL * getDP(size - 1, trng - total, 5, false));
        }
    }
  }
  return now;
}
int main() {
  dig[0] = 0;
  for (int i = 1; i < (1 << 12); ++i) dig[i] = dig[i & (i - 1)] + 1;
  for (int i = 1; i <= 4; ++i)
    for (int j = 0; j < (1 << (3 * i)); ++j) {
      bool ok = true;
      for (int k = 1; k <= i; ++k)
        if (((j >> ((k - 1) * 3)) & 7) == 0) ok = false;
      if (ok) ++tot[i][dig[j]];
    }
  for (int i = 1; i <= 4; ++i)
    for (int j = 0; j < (1 << (3 * 4 - 2 * i)); ++j) ++totsec[0][i][dig[j] + i];
  for (int i = 1; i <= 2; ++i)
    for (int j = 0; j < (1 << (3 * 3 - 2 * i)); ++j) ++totsec[1][i][dig[j] + i];
  for (int i = 1; i <= 1; ++i)
    for (int j = 0; j < (1 << (3 * 2 - 2 * i)); ++j) ++totsec[2][i][dig[j] + i];
  cin >> N >> K;
  memset(P, -1, sizeof(P));
  int result = getDP(N, K, 0, false);
  for (int i = 1; i <= K; ++i) result = 1LL * result * i % MOD;
  cout << result << '\n';
}
