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 C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <iostream>
#include <bits/stdc++.h>
#define loop(N) for(int i=0;i<N;i++)
#define vi vector<int>
#define vs vector<string>
#define vl vector<long long int>
#define vpi vector<pair<int,int>>
#define msi map<string,int>
#define mil map<int,long long int>
#define lli long long int
#define ulli unsigned long long int
using namespace std ;
void ps(string i){
    cout << i << endl;
}

template <class T>
void pt(T s){
    cout << s << endl;
}

void pi(int i){
    cout << i << endl;
}

template <class T>
void pv(vector<T> v){
    loop(v.size()){
        pt<T>(v[i]);
    }
}



/*********************************asserting****************************/

template <class T>
void asserty(T in,T out){

    if(in != out){
        ps("Test not passed:");
        pt<T>(in);
        ps("expected :");
        pt<T>(out);
    }
}

void assertv(vi in,vi out){
    bool equals = true;
    if( in.size()!=out.size()){
        equals = false;
    }else{
        loop(in.size()){
            if(in[i]!=out[i]){
                equals = false;
                break;
            }

        }

    }

    if(!equals){
        ps("Test not passed:");
        pv<int>(in);
        ps("expected :");
        pv<int>(in);
    }
}

/*********************************reused****************************/
ulli l[100];

ulli lucas(int k){
    if(l[k]>0)
        return l[k];
    l[k]=lucas(k-1)+lucas(k-2);
    return l[k];
}
int main()
{
    int n;
    cin >>n;
    loop(n+1){
        l[i]=0;
    }
    l[0]=2;
    l[1]=1;
    cout<<lucas(n)<<endl;
    return 0;
}