Problem:
Score : 200 points

Problem Statement

It is November 18 now in Japan. By the way, 11 and 18 are adjacent Lucas numbers.

You are given an integer N. Find the N-th Lucas number.

Here, the i-th Lucas number L_i is defined as follows:

L_0=2

L_1=1

L_i=L_{i-1}+L_{i-2} (i≥2)

Constraints

1≤N≤86

It is guaranteed that the answer is less than 10^{18}.

N is an integer.

Input

Input is given from Standard Input in the following format:

N

Output

Print the N-th Lucas number.

Sample Input 1

5

Sample Output 1

11

L_0=2

L_1=1

L_2=L_0+L_1=3

L_3=L_1+L_2=4

L_4=L_2+L_3=7

L_5=L_3+L_4=11

Thus, the 5-th Lucas number is 11.

Sample Input 2

86

Sample Output 2

939587134549734843

Solution in JavaScript (node.js v5.12) (judge verdict: Accepted)

"use strict"

function main(input) {
  //一部の正解がjsで扱う最大値を越えるため、文字列として扱う。
  //計算は配列を使った筆算（上の配列と下の配列を計算、桁上がりも対応）にて行う

  input = Number(input)

  let numbers = ["2", "1"]

  for (let i = 2; i <= input; i++) {
    const cal = (a, b) => {

      //左詰の配列だと計算しづらいのでreverse
      let aa = a
        .split("")
        .map(v => ~~v)
        .reverse()
      let bb = b
        .split("")
        .map(v => ~~v)
        .reverse()

      let cc = []
      let digit = 0
      //各配列の値についてaa[i] + bb[i]する=筆算 桁数の大きい方の回数
      for (let i = 0; i < bb.length; i++) {
        let tmp = Number(aa[i])
          ? Number(aa[i]) + Number(bb[i]) + digit
          : Number(bb[i]) + digit //
        digit = 0

        if (tmp >= 10) {
          digit = Math.floor(tmp / 10)
          tmp = tmp % 10
        } else {
          digit = 0
        }
        cc.push(tmp)

      }
      if (digit > 0) cc.push(digit)

      return cc.reverse().join("") //array -> recerse -> string
    }
    let tmp = cal(numbers[i - 2], numbers[i - 1])
    numbers.push(tmp)
  }
  console.log(numbers.pop()) //string

}
main(require("fs").readFileSync("/dev/stdin", "utf8"))