fun main() { val n = readLine()!!.toInt() val a = arrayOf( arrayOf(0L,1,1), arrayOf(1L,0,0), arrayOf(0L,1,0)) val an = pow(a, n) val ans = mul(an, arrayOf( arrayOf(1L), arrayOf(0L), arrayOf(0L))).sumOf { it.first() } println((ans + 1_000_000_007) % 1_000_000_007) } fun pow(A : Array>, n : Int): Array> { var t = n var res = arrayOf( arrayOf(1L,0,0), arrayOf(0L,1,0), arrayOf(0L,0,1)) var a = A while (t > 0) { if (t and 1 == 1) res = mul(res, a) a = mul(a, a) t /= 2 } return res } fun mul(A : Array>, B : Array>): Array> { val res = Array(A.size) { Array(B.first().size) { 0L } } for (i in 0 until A.size) { for (j in 0 until B.first().size) { for (k in 0 until B.size) { res[i][j] += (A[i][k] * B[k][j]) % 1_000_000_007 res[i][j] %= 1_000_000_007L } } } return res }