import sequtils proc IDE*(T : typedesc[int]) : int = return 0 proc PRO*(T : typedesc[int]) : int = return 1 type mint[M : static[int]] = object val : int proc inv_mod*(A , M : int) : int = var a = A b = M x = 1 u = 0 while b > 0: var q = a div b var tmp = u u = x - q * u x = tmp tmp = b b = a - q * b a = tmp return (A + M) mod M proc newMint*[M](val : int) : mint[M] = return mint[M](val : (val mod M + M) mod M) proc `$`*[M](m : mint[M]) : string = return m.val.intToStr proc `+`*[M](a : mint[M] , b : mint[M]) : mint[M] = return mint[M](val : (a.val + b.val) mod M) proc `-`*[M](a : mint[M] , b : mint[M]) : mint[M] = return mint[M](val : (a.val - b.val + M) mod M) proc `*`*[M](a : mint[M] , b : mint[M]) : mint[M] = return mint[M](val : (a.val * b.val) mod M) proc `/`*[M](a : mint[M] , b : mint[M]) : mint[M] = return mint[M](val : (a.val * inv_mod(b.val , M)) mod M) proc `+`*[M](a : mint[M] , b : int) : mint[M] = return mint[M](val : (a.val + b) mod M) proc `-`*[M](a : mint[M] , b : int) : mint[M] = return mint[M](val : (a.val - b + M) mod M) proc `*`*[M](a : mint[M] , b : int) : mint[M] = return mint[M](val : (a.val * b) mod M) proc `/`*[M](a : mint[M] , b : int) : mint[M] = return mint[M](val : (a.val * inv_mod(b , M)) mod M) proc `+`*[M](a : int , b : mint[M]) : mint[M] = return mint[M](val : (a + b.val) mod M) proc `-`*[M](a : int , b : mint[M]) : mint[M] = return mint[M](val : (a - b.val + M) mod M) proc `*`*[M](a : int , b : mint[M]) : mint[M] = return mint[M](val : (a * b.val) mod M) proc `/`*[M](a : int , b : mint[M]) : mint[M] = return mint[M](val : (a * inv_mod(b.val , M)) mod M) proc `^`*[M](a : mint[M] , b : int) : mint[M] = var ans = newMint[M](1) c = a r = b while r > 0: if (r and 1) == 1: ans *= c c = c * c r = r shr 1 return ans type MM = mint[(int)(1e9 + 7)] proc IDE*(T : typedesc[MM]) : MM = return MM(val : 0) proc PRO*(T : typedesc[MM]) : MM = return MM(val : 1) type Matrix*[T] = seq[seq[T]] proc newMatrix*[T](h , w : int) : Matrix[T] = var mat : Matrix[T] = newSeqWith(h,newSeqWith(w , IDE(T))) return mat proc `*`*[T](a , b : Matrix[T]) : Matrix[T] = var res = newMatrix[T](a.len , b[0].len) for i in 0.. 0: if (r and 1) == 1: res = res * A A = A * A r = r shr 1 return res # verify https://yukicoder.me/problems/no/718 import strutils var N = stdin.readline.parseInt m = @[@[MM(val : 1) , MM(val : 0)]] mm = @[@[MM(val : 1) , MM(val : 1)] , @[MM(val : 1 ,) , MM(val : 0)]] a = (m * (mm ^ (N))) echo a[0][0] * a[0][1]