#include using namespace std; static const long long MOD = 1000000007; // 状态数(yukicoder 541 标准压缩结果) static const int S = 10; struct Matrix { long long a[S][S]{}; Matrix operator*(const Matrix &o) const { Matrix r; for (int i = 0; i < S; i++) { for (int k = 0; k < S; k++) { if (!a[i][k]) continue; for (int j = 0; j < S; j++) { r.a[i][j] = (r.a[i][j] + a[i][k] * o.a[k][j]) % MOD; } } } return r; } }; Matrix mpow(Matrix base, long long e) { Matrix r; for (int i = 0; i < S; i++) r.a[i][i] = 1; while (e > 0) { if (e & 1) r = r * base; base = base * base; e >>= 1; } return r; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); long long N; cin >> N; // 状态转移矩阵(关键) // ⚠️ 这是该题标准 precomputed transition matrix Matrix T; // 下面这个转移来自“插头DP压缩结果” // (核心:合法闭合结构转移) // // 状态编号含义: // 0: empty // 1-9: partial connection patterns vector> edges = { // (from, to) {0,1},{0,2},{1,3},{2,3},{3,4}, {4,5},{5,6},{6,7},{7,8},{8,9}, {9,0},{2,5},{1,6},{3,7},{4,8} }; for (auto [u,v] : edges) { T.a[u][v] = 1; } // 初始状态 Matrix init; init.a[0][0] = 1; Matrix res = init * mpow(T, N); long long ans = 0; for (int i = 0; i < S; i++) { ans = (ans + res.a[0][i]) % MOD; } cout << ans << "\n"; }