#include <cstdio>
#include <cstring>
#define N 4
#define DIGIT N*N
#define THRESHOLD 4
using namespace std;
bool vis[DIGIT + 1];
long long int dp[DIGIT + 1][1<<(DIGIT + 1)][DIGIT + 1];
int ban_1[DIGIT + 1][DIGIT + 1] = {
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 2, 2, 0, 0, 0, 0, 5, 0, 6, 0, 5, 0, 0, 6},
{0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 6, 0, 7, 0, 6, 0, 0},
{0, 2, 0, 0, 0, 0, 0, 0, 0, 6, 0, 7, 0, 0, 0, 7, 0},
{0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 7, 0, 8, 7, 0, 0, 8},
{0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 9, 0,10, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0,10, 0,11},
{0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0,10, 0,11, 0},
{0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0,11, 0,12},
{0, 5, 0, 6, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0},
{0,0, 6, 0, 7, 0, 0, 0, 0, 0, 0, 0,11, 0, 0, 0, 0},
{0,6, 0, 7, 0, 0, 0, 0, 0,10, 0, 0, 0, 0, 0, 0, 0},
{0,0, 7, 0, 8, 0, 0, 0, 0,10,11, 0, 0, 0, 0, 0, 0},
{0,5, 0, 0, 7, 9, 0,10, 0, 0, 0, 0, 0, 0, 0,14,14},
{0,0, 6, 0, 0, 0,10, 0,11, 0, 0, 0, 0, 0, 0, 0,15},
{0,0, 0, 7, 0,10, 0,11, 0, 0, 0, 0, 0,14, 0, 0, 0},
{0,6, 0, 0, 8, 0,11, 0,12, 0, 0, 0, 0,14,15, 0, 0}
};
int ban_2[DIGIT + 1][DIGIT + 1] = {
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 2, 3, 0, 0, 0, 0, 5, 0, 6, 0, 9, 0, 0,11},
{0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 6, 0, 7, 0,10, 0, 0},
{0, 2, 0, 0, 0, 0, 0, 0, 0, 6, 0, 7, 0, 0, 0,11, 0},
{0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 7, 0, 8,10, 0, 0,12},
{0, 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 0, 9, 0,10, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0,10, 0,11},
{0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0,10, 0,11, 0},
{0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0,11, 0,12},
{0, 5, 0, 6, 0, 0, 0, 0, 0, 0, 0,10,11, 0, 0, 0, 0},
{0,0, 6, 0, 7, 0, 0, 0, 0, 0, 0, 0,11, 0, 0, 0, 0},
{0,6, 0, 7, 0, 0, 0, 0, 0,10, 0, 0, 0, 0, 0, 0, 0},
{0,0, 7, 0, 8, 0, 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0},
{0,9, 0, 0,10, 9, 0,10, 0, 0, 0, 0, 0, 0, 0,14,15},
{0,0,10, 0, 0, 0,10, 0,11, 0, 0, 0, 0, 0, 0, 0,15},
{0,0, 0,11, 0,10, 0,11, 0, 0, 0, 0, 0,14, 0, 0, 0},
{0,11,0, 0,12, 0,11, 0,12, 0, 0, 0, 0,15,15, 0, 0}
};
long long int dfs(int len, int pre, int status, bool is_zero) {
if(len <= 0) return 1;
if(!is_zero && dp[len][status][pre] != -1)
return dp[len][status][pre];
long long int sum = 0;
for(int i = 0; i <= DIGIT; i++) {
if(vis[i]) continue;
if(is_zero) {
if(!i) {
if(len > THRESHOLD)
sum += dfs(len - 1, 0, 0, true);
}
else {
vis[i] = true;
sum += dfs(len - 1, i, 1<<i, false);
vis[i] = false;
}
}
else if(i) {
if(!ban_1[pre][i] || (vis[ban_1[pre][i]] && vis[ban_2[pre][i]])) {
vis[i] = true;
sum += dfs(len - 1, i, (1<<i) + status, false);
vis[i] = false;
}
}
}
if(!is_zero)
dp[len][status][pre] = sum;
return sum;
}
int main() {
memset(vis, false, sizeof(vis));
memset(dp, -1, sizeof(dp));
printf("%lld\n", dfs(DIGIT, 0, 0, true));
return 0;
}