/* -*- coding: utf-8 -*- * * 1598.cc: No.1598 4×4 Grid - yukicoder */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; /* constant */ const int N = 4; const int NN = N * N; const int NNBITS = 1 << NN; const int MAX_K = 216; const int dxs[] = { 1, 0, -1, 0 }, dys[] = { 0, -1, 0, 1 }; /* typedef */ typedef long long ll; /* global variables */ int bnums[NNBITS], nbs[NN], phs[NNBITS]; ll dp[NNBITS][MAX_K + 1]; /* subroutines */ inline int xy2p(int x, int y) { return y * N + x; } inline void p2xy(int p, int &x, int &y) { x = p % N, y = p / N; } /* main */ int main() { bnums[0] = 0; for (int bits = 1, msb = 1; bits < NNBITS; bits++) { if ((msb << 1) <= bits) msb <<= 1; bnums[bits] = bnums[bits ^ msb] + 1; } for (int u = 0; u < NN; u++) { int x, y; p2xy(u, x, y); for (int di = 0; di < 4; di++) { int vx = x + dxs[di], vy = y + dys[di]; if (vx >= 0 && vx < N && vy >= 0 && vy < N) nbs[u] |= (1 << xy2p(vx, vy)); } } for (int bits = 0; bits < NNBITS; bits++) for (int i = 0, bi = 1; i < NN; i++, bi <<= 1) if (bits & bi) phs[bits] += bnums[nbs[i]] - bnums[bits & nbs[i]]; int k; scanf("%d", &k); dp[0][0] = 1; for (int bits = 0; bits < NNBITS; bits++) for (int j = 0, bj = 1; j < NN; j++, bj <<= 1) if (! (bits & bj)) { int bits1 = (bits | bj); int di1 = phs[bits1]; for (int i = 0; i + di1 <= k; i++) dp[bits1][i + di1] += dp[bits][i]; } printf("%lld\n", dp[NNBITS - 1][k]); return 0; }