#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
inline int add(int x, int y) { return (x + y) % MOD; }
inline int mul(int x, int y) { return (long long)x * y % MOD; }
const int tri[5] = {4, 3, 2, 1, 2};
const int con[5] = {4, 2, 1, 0, 0};
long long dp[201][201][5][3];
long long cmb[10][10];
long long solve(int n, int k, int mask, int type) {
  long long &ret = dp[n][k][mask][type];
  if (ret != -1) return ret;
  ret = 0;
  if (type == 0) {
    ret = add(ret, solve(n, k, mask, 1));
    if (mask == 0) {
      if (k >= 1) {
        ret = add(ret, mul(solve(n, k - 1, 1, 1), 4));
        ret = add(ret, mul(solve(n, k - 1, 2, 1), 4));
      }
      if (k >= 2) {
        ret = add(ret, mul(solve(n, k - 2, 2, 1), 4));
        ret = add(ret, mul(solve(n, k - 2, 3, 1), 8));
        ret = add(ret, mul(solve(n, k - 2, 4, 1), 2));
        if (k == 2) ret = add(ret, 2);
      }
      if (k >= 3) {
        ret = add(ret, mul(solve(n, k - 3, 3, 1), 4));
        if (k == 3) ret = add(ret, 4);
      }
      if (k == 4) ret = add(ret, 1);
    } else if (mask == 1) {
      if (k >= 1) {
        ret = add(ret, mul(solve(n, k - 1, 2, 1), 2));
        ret = add(ret, mul(solve(n, k - 1, 3, 1), 2));
        ret = add(ret, mul(solve(n, k - 1, 4, 1), 1));
      }
      if (k >= 2) {
        ret = add(ret, mul(solve(n, k - 2, 3, 1), 3));
        if (k == 2) ret = add(ret, 2);
      }
      if (k == 3) ret = add(ret, 1);
    } else if (mask == 2) {
      if (k >= 1) {
        ret = add(ret, mul(solve(n, k - 1, 3, 1), 2));
        if (k == 1) ret = add(ret, 1);
      }
      if (k == 2) ret = add(ret, 1);
    } else if (mask == 3) {
      if (k == 1) ret = add(ret, 1);
    } else {
      if (k >= 1) ret = add(ret, mul(solve(n, k - 1, 3, 1), 2));
      if (k == 2) ret = add(ret, 1);
    }
  } else if (type == 1) {
    if (n == 0) return ret = k == 0;
    int all = tri[mask] << 1;
    int cons = con[mask];
    for (int i = 0; i <= cons && i <= k; i++) {
      for (int j = 0; 2 * i + j <= all && i + j <= k; j++) {
        ret = add(ret, mul(solve(n, k - i - j, mask, 2),
                           mul(cmb[cons][i], cmb[all - 2 * i][j])));
      }
    }
  } else {
    int cnt = tri[mask];
    for (int i = 0; i <= cnt && i <= k; i++) {
      ret = add(ret, mul(solve(n - 1, k - i, mask, 0), cmb[cnt][i]));
    }
  }
  return ret;
}
int main() {
  ios_base::sync_with_stdio(0);
  int n, k;
  cin >> n >> k;
  for (int i = 0; i < 10; i++) {
    cmb[i][0] = 1;
    for (int j = 1; j <= i; j++)
      cmb[i][j] = add(cmb[i - 1][j - 1], cmb[i - 1][j]);
  }
  memset(dp, -1, sizeof(dp));
  long long ret = solve(n, k, 0, 0);
  for (int i = 1; i <= k; i++) ret = ret * i % MOD;
  cout << ret << endl;
  return 0;
}
