#include using namespace std; static const int MOD = 1e9 + 7; static const int S = 8; vector trans[S]; bool valid(int cur, int nxt) { // 核心正确约束: // 1. 不允许断开已有连接 if ((cur & ~nxt) != 0) return false; // 2. 不允许产生非法孤立结构(关键修正点) // 防止 101 这种不可能由 tile 构造的结构 int x = cur | nxt; // 必须满足:不能出现“单侧悬空连接” if ((x & 0b101) == 0b001) return false; if ((x & 0b101) == 0b100) return false; return true; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N; cin >> N; for (int i = 0; i < S; i++) { for (int j = 0; j < S; j++) { if (valid(i, j)) { trans[i].push_back(j); } } } vector> dp(N + 1, vector(S, 0)); // 初始:空列 dp[1][0] = 1; for (int i = 2; i <= N; i++) { for (int cur = 0; cur < S; cur++) { for (int nxt : trans[cur]) { dp[i][nxt] = (dp[i][nxt] + dp[i - 1][cur]) % MOD; } } } long long ans = 0; for (int i = 0; i < S; i++) { ans = (ans + dp[N][i]) % MOD; } cout << ans << "\n"; }