package main import . "fmt" func main() { var n int Scan(&n) m := newMat( 0,1,1,1, 1,0,1,1, 1,1,0,1, 1,1,1,0, ) v := newVec(1,0,0,0) ans := m.pow(n).mulVec(v).t[0] Println(ans) } const M = 1e9+7 const S = 4 type Mat struct { t [S][S]int } type Vec struct { t [S]int } func newMat(params ...int) *Mat { r := &Mat{} for i := 0; i < S && len(params) > 0; i++ { copy(r.t[i][:], params) params = params[min(S,len(params)):] } return r } func newVec(params ...int) *Vec { r := &Vec{} copy(r.t[:], params) return r } func (m1 *Mat) mulMat(m2 *Mat) *Mat { r := &Mat{} for row := 0; row < S; row++ { for col := 0; col < S; col++ { for k := 0; k < S; k++ { r.t[row][col] += m1.t[row][k] * m2.t[k][col] % M r.t[row][col] %= M } } } return r } func (m *Mat) pow(p int) *Mat { x := m r := newMat( 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, ) for p > 0 { if p % 2 != 0 { r = r.mulMat(x) } x = x.mulMat(x) p /= 2 } return r } func (m *Mat) mulVec(v *Vec) *Vec { r := &Vec{} for row := 0; row < S; row++ { for k := 0; k < S; k++ { r.t[row] += m.t[row][k] * v.t[k] % M r.t[row] %= M } } return r } /* 考察 行列累乗の問題に見える | A[N] | | 0 1 1 1 |^N | A[0] | | B[N] | = | 1 0 1 1 | * | B[0] | | C[N] | | 1 1 0 1 | | C[0] | | D[N] | | 1 1 1 0 | | D[0] | */