#define _USE_MATH_DEFINES #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; const int MOD = 1000000007; template vector > matrixProduct(const vector >& x, const vector >& y) { int a = x.size(); int b = x[0].size(); int c = y[0].size(); vector > z(a, vector(c, 0)); for(int i=0; i vector > matrixPower(const vector >& x, long long k) { int n = x.size(); vector > y(n, vector(n, 0)); for(int i=0; i > z = x; while(k > 0){ if(k & 1) y = matrixProduct(y, z); z = matrixProduct(z, z); k >>= 1; } return y; } string normalizeState(string s) { char newChar = 'A'; map to; to['.'] = '.'; int n = s.size(); string ans(n, '.'); for(int i=0; i<2; ++i){ string t(n, '.'); for(int j=0; j& state) { vector > nonEmptyState(len+1); nonEmptyState[0].insert(""); for(int i=0; i preState; for(int i=0; i<(1< bs(i); for(const string s : nonEmptyState[bs.count()]){ int k = 0; string t(len, '.'); for(int j=0; j(preState.begin(), preState.end()); } long long solve(long long n, int len) { vector state; makeState(len, state); int stateNum = state.size(); vector > mat(stateNum*2+1, vector(stateNum*2+1, 0)); mat[stateNum*2][stateNum*2] = 1; for(int a=0; a upper; for(int i=0; i side(i << 1); bool ng = false; int cnt = 0; for(int j=0; j= 2 || (sameCnt == 1 && t != string(len, '.'))) continue; if(t == string(len, '.') && cnt > 0){ ++ mat[stateNum*2][a+stateNum]; mat[stateNum*2][a] += cnt; } else{ t = normalizeState(t); int b = find(state.begin(), state.end(), t) - state.begin(); ++ mat[b][a]; ++ mat[b+stateNum][a+stateNum]; mat[b+stateNum][a] += cnt; } } } mat = matrixPower(mat, n+1); return mat[stateNum*2][0]; } int main() { long long n; cin >> n; cout << solve(n, 4) << endl; return 0; }