#include #include #include #include #include constexpr int MOD = 1e9 + 7; struct modint { int n; modint(int n = 0) : n(n) {} }; modint operator+(modint a, modint b) { return modint((a.n += b.n) >= MOD ? a.n - MOD : a.n); } modint operator-(modint a, modint b) { return modint((a.n -= b.n) < 0 ? a.n + MOD : a.n); } modint operator*(modint a, modint b) { return modint(1LL * a.n * b.n % MOD); } modint &operator+=(modint &a, modint b) { return a = a + b; } modint &operator-=(modint &a, modint b) { return a = a - b; } modint &operator*=(modint &a, modint b) { return a = a * b; } using vec = std::array; using mat = std::array; mat operator*(mat a, mat b) { mat c = {}; for (int i = 0; i < 10; i++) { for (int k = 0; k < 10; k++) { for (int j = 0; j < 10; j++) { c[i][j] += a[i][k] * b[k][j]; } } } return c; } mat matpow(mat a, long long b) { mat ret = {}; for (int i = 0; i < 10; i++) { ret[i][i] = 1; } while (b > 0) { if (b % 2 == 1) { ret = ret * a; } a = a * a; b /= 2; } return ret; } int main() { std::vector> g = { {0,1,2,3,4,5,6,8}, // 0 {1,4,6,8,9}, // 1 {2,4,5,8,9}, // 2 {3,5,6,8,9}, // 3 {1,2,4,5,8,9}, // 4 {2,3,4,5,8,9}, // 5 {6,8}, // 6 {1,3,7,9}, // 7 {1,2,3,4,5,7,8,9}, // 8 {9}, // 9 }; mat A = {}; for (int i = 0; i < g.size(); i++) { for (int j : g[i]) { A[j][i] = 1; } } long long N; std::cin >> N; A = matpow(A, N + 1); std::cout << A[9][0].n << std::endl; }