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 Rust (1.15.1) (judge verdict: Accepted)

extern crate core;

use std::io::{self, Read};
use std::collections::HashMap;

fn main() {
    let mut input = String::new();
    io::stdin().read_to_string(&mut input).unwrap();
    let output = run(input);
    println!("{}", output);
}

fn l(i: i32, map: &mut HashMap<i32, i64>) -> i64 {
    match map.get(&i) {
        Option::Some(&x) => x,
        Option::None => {
            let x = l(i - 1, map) + l(i - 2, map);
            map.insert(i, x);
            x
        }
    }
}

fn lucas(i: i32) -> i64 {
    let mut map = HashMap::new();
    map.insert(0, 2);
    map.insert(1, 1);
    l(i, &mut map)
}

fn run(input: String) -> String {
    let i = input.trim().parse::<i32>().unwrap();

    lucas(i).to_string()
}

#[test]
fn test() {
    let tests = vec![("5", "11"), ("86", "939587134549734843")];
    for (i, (input, output)) in tests.into_iter().enumerate() {
        println!("test:{}", i);
        assert_eq!(run(input.to_string()), output.to_string());
    }
}