#!/usr/bin/env python3

#ABC122 D



#条件を満たさないものは以下の5通りで追加する文字列+3文字を見れば決まる

#ACG,GAC,AGC,A?GC,AG?C

n = int(eval(input()))

#メモ化再帰

memo = [{} for i in range(n+1)]

mod = 10**9 + 7



def ok(last4):

    for i in range(4):

        t = list(last4)

        if i >= 1:

            t[i-1],t[i] = t[i],t[i-1]

        if ''.join(t).count('AGC') >= 1:

            return False

    return True



def dfs(cur, last3):

    if last3 in memo[cur]:

        return memo[cur][last3]

    if cur == n:

        return 1

    ret = 0

    #AGCTを1文字ずつ追加してみる

    for c in 'AGCT':

        #cを追加したときにTrue(不適でない)なら

        if ok(last3 + c):

            #現在位置を1つ進めてcを追加した値を足す

            ret = (ret + dfs(cur + 1, last3[1:] + c)) % mod

    #値を格納

    memo[cur][last3] = ret

    return ret

print((dfs(0,'TTT')))

#!/usr/bin/env python3

#ABC122 D

n = int(eval(input()))

mod = 10**9+7



dp = [[[[0]*4 for _ in range(4)] for _ in range(4)] for _ in range(n+1)]

#長さ0の文字列は1

#0,1,2(A,G,C)に関する制約しかないため

#Sは、TTTSと考えてもよい

dp[0][3][3][3] = 1



#swapしてAGCが発生しない文字列:=AGC,ACG,GAC,A?GC,AG?Cを含まない文字列

#A:=0,G:=1,C:=2,T:=3



#文字列の文字数

for i in range(n):

    #最後から1文字目

    for j in range(4):

        #最後から2文字目

        for k in range(4):

            #条件に当てはまるものがない場合

            if dp[i][j][k] == 0:

                continue

            #最後から3文字目

            for l in range(4):

                #新たに追加する文字

                for a in range(4):

                    #ダメな5条件をカット



                    #AGCの場合

                    if a == 2 and j == 1 and k == 0:continue

                    #GACの場合

                    if a == 2 and j == 0 and k == 1:continue

                    #ACGの場合

                    if a == 1 and j == 2 and k == 0:continue

                    #A?GCの場合

                    if a == 2 and j == 1 and l == 0:continue

                    #AG?Cの場合

                    if a == 2 and k == 1 and l == 0:continue



                    #ダメの条件を抜けると、aを足した文字列が作れる

                    dp[i+1][a][j][k] += dp[i][j][k][l]

                    dp[i+1][a][j][k] %= mod



ans = 0

for j in range(4):

    for k in range(4):

        for l in range(4):

            #長さnの全通り回収

            ans += dp[n][j][k][l]

            ans %= mod

print(ans)

#!/usr/bin/env python3
# ABC122 D
# 条件を満たさないものは以下の5通りで追加する文字列+3文字を見れば決まる
# ACG,GAC,AGC,A?GC,AG?C
n = int(eval(input()))
# メモ化再帰
memo = [{} for i in range(n + 1)]
mod = 10**9 + 7


def ok(last4):
    for i in range(4):
        t = list(last4)
        if i >= 1:
            t[i - 1], t[i] = t[i], t[i - 1]
        if "".join(t).count("AGC") >= 1:
            return False
    return True


def dfs(cur, last3):
    if last3 in memo[cur]:
        return memo[cur][last3]
    if cur == n:
        return 1
    ret = 0
    # AGCTを1文字ずつ追加してみる
    for c in "AGCT":
        # cを追加したときにTrue(不適でない)なら
        if ok(last3 + c):
            # 現在位置を1つ進めてcを追加した値を足す
            ret = (ret + dfs(cur + 1, last3[1:] + c)) % mod
    # 値を格納
    memo[cur][last3] = ret
    return ret


print((dfs(0, "TTT")))

#!/usr/bin/env python3
# ABC122 D
n = int(eval(input()))
mod = 10**9 + 7
dp = [[[[0] * 4 for _ in range(4)] for _ in range(4)] for _ in range(n + 1)]
# 長さ0の文字列は1
# 0,1,2(A,G,C)に関する制約しかないため
# Sは、TTTSと考えてもよい
dp[0][3][3][3] = 1
# swapしてAGCが発生しない文字列:=AGC,ACG,GAC,A?GC,AG?Cを含まない文字列
# A:=0,G:=1,C:=2,T:=3
# 文字列の文字数
for i in range(n):
    # 最後から1文字目
    for j in range(4):
        # 最後から2文字目
        for k in range(4):
            # 条件に当てはまるものがない場合
            if dp[i][j][k] == 0:
                continue
            # 最後から3文字目
            for l in range(4):
                # 新たに追加する文字
                for a in range(4):
                    # ダメな5条件をカット
                    # AGCの場合
                    if a == 2 and j == 1 and k == 0:
                        continue
                    # GACの場合
                    if a == 2 and j == 0 and k == 1:
                        continue
                    # ACGの場合
                    if a == 1 and j == 2 and k == 0:
                        continue
                    # A?GCの場合
                    if a == 2 and j == 1 and l == 0:
                        continue
                    # AG?Cの場合
                    if a == 2 and k == 1 and l == 0:
                        continue
                    # ダメの条件を抜けると、aを足した文字列が作れる
                    dp[i + 1][a][j][k] += dp[i][j][k][l]
                    dp[i + 1][a][j][k] %= mod
ans = 0
for j in range(4):
    for k in range(4):
        for l in range(4):
            # 長さnの全通り回収
            ans += dp[n][j][k][l]
            ans %= mod
print(ans)

-# 条件を満たさないものは以下の5通りで追加する文字列+3文字を見れば決まる -# ACG,GAC,AGC,A?GC,AG?C -# メモ化再帰 -memo = [{} for i in range(n + 1)] - - -def ok(last4): -    for i in range(4): -        t = list(last4) -        if i >= 1: -            t[i - 1], t[i] = t[i], t[i - 1] -        if "".join(t).count("AGC") >= 1: -            return False -    return True - - -def dfs(cur, last3): -    if last3 in memo[cur]: -        return memo[cur][last3] -    if cur == n: -        return 1 -    ret = 0 -    # AGCTを1文字ずつ追加してみる -    for c in "AGCT": -        # cを追加したときにTrue(不適でない)なら -        if ok(last3 + c): -            # 現在位置を1つ進めてcを追加した値を足す -            ret = (ret + dfs(cur + 1, last3[1:] + c)) % mod -    # 値を格納 -    memo[cur][last3] = ret -    return ret - - -print((dfs(0, "TTT"))) +dp = [[[[0] * 4 for _ in range(4)] for _ in range(4)] for _ in range(n + 1)] +# 長さ0の文字列は1 +# 0,1,2(A,G,C)に関する制約しかないため +# Sは、TTTSと考えてもよい +dp[0][3][3][3] = 1 +# swapしてAGCが発生しない文字列:=AGC,ACG,GAC,A?GC,AG?Cを含まない文字列 +# A:=0,G:=1,C:=2,T:=3 +# 文字列の文字数 +for i in range(n): +    # 最後から1文字目 +    for j in range(4): +        # 最後から2文字目 +        for k in range(4): +            # 条件に当てはまるものがない場合 +            if dp[i][j][k] == 0: +                continue +            # 最後から3文字目 +            for l in range(4): +                # 新たに追加する文字 +                for a in range(4): +                    # ダメな5条件をカット +                    # AGCの場合 +                    if a == 2 and j == 1 and k == 0: +                        continue +                    # GACの場合 +                    if a == 2 and j == 0 and k == 1: +                        continue +                    # ACGの場合 +                    if a == 1 and j == 2 and k == 0: +                        continue +                    # A?GCの場合 +                    if a == 2 and j == 1 and l == 0: +                        continue +                    # AG?Cの場合 +                    if a == 2 and k == 1 and l == 0: +                        continue +                    # ダメの条件を抜けると、aを足した文字列が作れる +                    dp[i + 1][a][j][k] += dp[i][j][k][l] +                    dp[i + 1][a][j][k] %= mod +ans = 0 +for j in range(4): +    for k in range(4): +        for l in range(4): +            # 長さnの全通り回収 +            ans += dp[n][j][k][l] +            ans %= mod +print(ans)