Go: package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

func main() {
	sc := bufio.NewScanner(os.Stdin)
	sc.Split(bufio.ScanWords)
	n, err := nextInt(sc)
	if err != nil {
		panic(err)
	}
	fmt.Println(fibonacci(n, make(map[int]int)))
}

func fibonacci(x int, memo map[int]int) int {
	if x == 0 || x == 1 {
		return 1
	}
	if y, ok := memo[x]; ok {
		return y
	}
	z := fibonacci(x-1, memo) + fibonacci(x-2, memo)
	memo[x] = z
	return z
}

func nextInt(sc *bufio.Scanner) (int, error) {
	sc.Scan()
	return strconv.Atoi(sc.Text())
}

C++: #include <iostream>
#include <map>
using namespace std;
int memofib(int n) {
    static map<int,int> cache;
    map<int,int>::iterator it = cache.find(n);
    if( it != cache.cend() )
        return it->second;   
    int t;
    if(n==1) 
        return 1;
    else if(n==2)
        return 2;
    else
        return memofib(n-1) + memofib(n-2);
    cache.insert(std::make_pair(n, t));
    return t;
}
int main(void){
    int n;
    cin >> n ;
    cout << memofib(n) << endl;
    return 0;
}

C++: #include<iostream>
using namespace std;
int data[45];
int fib(int n){
  if(data[n]) return data[n];
  if(n==0||n==1) return data[n]=1;
  return data[n]=fib(n-1)+fib(n-2);
}
int main(){
  int n; cin>>n;
  cout<<fib(n)<<endl;
  return 0;
}

C++: #include<stdio.h>

int main(){
  int i,input,fibonacciA=1,fibonacciB=1,fibonacciC=1;
  scanf("%d",&input);
  if(input == 0 || input == 1){
    printf("%d\n",fibonacciA);
  }else{
    for(i=1;i<input;i++){
      fibonacciC = fibonacciB + fibonacciA;
      fibonacciA = fibonacciB;
      fibonacciB = fibonacciC;
    }
    printf("%d\n",fibonacciC);
  }
  return 0;
}

C++: #include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0;i<n;i++)
#define REP(i,s,n) for(int i=s;i<n;i++)
#define all(a) a.begin(),a.end()
typedef long long ll;
const double phi = (1 + sqrt(5)) / 2;
const double phi_ = (1 - sqrt(5)) / 2;
double fib(ll n){
    double res = pow(phi, n+1) - pow(phi_, n+1);
    return res / sqrt(5);
}
int main(){
    ll n, ans; cin >> n;
    ans = fib(n);
    cout << ans << endl;
    return 0;
}

C++: #include<iostream>
using namespace std;

int main(){
    int n; cin >> n;
    int F[50];
    F[0] = F[1] = 1;
    for(int i = 2; i <= n; i++) F[i] = F[i-1] + F[i-2];
    
    cout << F[n] << endl;
    
    return 0;
}

C++: #include <cstdio>
#include <iostream>

using namespace std;

int F[50];

int fib(int n) {

	if (n == 0 || n == 1)
		return 1;
	if (F[n] != 0)
		return F[n];

	F[n] = fib(n - 1) + fib(n - 2);

	return F[n];
}

int main() {

	int n;
	scanf("%d", &n);

	for (int i = 0; i < n; ++i) {
		F[i] = 0;
	}

	cout << fib(n) << endl;

	return 0;

}

C++: #include "stdio.h"

#define MAX 50
#define INIT -1

int dp[MAX];

int fibonacci(int n){
  if(n == 0 || n == 1){
    return dp[n] = 1;
  }

  if(dp[n] >= 0 ){
    return dp[n];
  }else{
    return dp[n] = fibonacci(n-1) + fibonacci(n-2);    
  }
}


int main(void){
  
  int N;
  scanf("%d", &N);
  
  for(int i=0;i<MAX;i++){
    dp[i] = INIT;
  }
    
  printf("%d\n", fibonacci(N));

  return 0;
}

C++: #line 1 "/mnt/c/Users/leafc/dev/compro/lib/template.hpp"


#include <bits/stdc++.h>
#define REP(i, n) for (int i = 0; i < n; i++)
#define FOR(i, m, n) for (int i = m; i < n; i++)
#define ALL(v) (v).begin(), (v).end()
#define coutd(n) cout << fixed << setprecision(n)
#define ll long long int
#define vl vector<ll>
#define vi vector<int>
const int INF = 2147483647;
const ll MOD = 1000000007;

using namespace std;


#line 2 "tmp.cpp"

int main() {
  ll fib[45] = {};
  fib[0] = 1;
  fib[1] = 1;
  FOR(i, 2, 45) { fib[i] = fib[i - 1] + fib[i - 2]; }
  int n;
  cin >> n;
  cout << fib[n] << endl;
  return 0;
}

C++: #include <iostream>
using namespace std;

int n;
int fib(int);
int main()
{
    cin >> n;
    cout << fib(n);
    return 0;
}

int fib(int n){
    if(n <= 1)
        return 1;
    else
        return fib(n-1) + fib(n-2);
}

C++: #include <bits/stdc++.h>
using namespace std;

#define rep(i, n) for (int i = 0; i < n; ++i)
#define ALL(a) (a).begin(), (a).end()

template <class T>
inline bool chmin(T &a, T b){
  if (a > b)
  {
    a = b;
    return true;
  }
  return false;
}
template <class T>
inline bool chmax(T &a, T b){
  if (a < b)
  {
    a = b;
    return true;
  }
  return false;
}

using ll = long long;
using ld = long double;
using P = pair<int, int>;
using DoP = pair<double, double>;
using edge = struct { int to; ll cost; }; // edge x = {to, cost}

const int di[] = {0, 1, 0, -1, 1, 1, -1, -1};
const int dj[] = {1, 0, -1, 0, 1, -1, 1, -1};
const int INF = 400000000;
const ll INF64 = 1ll << 40;
const int mod = 1000000007;

struct Sieve
{
  int n;
  vector<int> f, primes;
  Sieve(int n = 1) : n(n), f(n + 1)
  {
    f[0] = f[1] = -1;
    for (ll i = 2; i <= n; ++i)
    {
      if (f[i])
        continue;
      primes.push_back(i);
      f[i] = i;
      for (ll j = i * i; j <= n; j += i)
      {
        if (!f[j])
          f[j] = i;
      }
    }
  }
  bool isPrime(int x) { return f[x] == x; }
  vector<int> factorList(int x)
  {
    vector<int> res;
    while (x != 1)
    {
      res.push_back(f[x]);
      x /= f[x];
    }
    return res;
  }
  vector<P> factor(int x)
  {
    vector<int> fl = factorList(x);
    if (fl.size() == 0)
      return {};
    vector<P> res(1, P(fl[0], 0));
    for (int p : fl)
    {
      if (res.back().first == p)
      {
        res.back().second++;
      }
      else
      {
        res.emplace_back(p, 1);
      }
    }
    return res;
  }
};
struct UnionFind
{
  vector<int> par;
  vector<int> siz;
  UnionFind(int N) : par(N), siz(N, 1) {for (int i = 0; i < N; i++) par[i] = i;}
  
  void init(int N) {
    siz.assign(N, 1);
    par.resize(N);
    for(int i = 0; i < N; ++i) par[i] = i;
  }

  int root(int x) {
    while(par[x] != x) {x = par[x] = par[par[x]];}
    return x;
  }

  bool unite(int x, int y)
  {
    x = root(x);
    y = root(y);
    if(x == y) return false;

    if(siz[x] < siz[y]) swap(x, y);
    siz[x] += siz[y];
    par[y] = x;
    return true;

  }

  bool isSame(int x, int y) {return root(x) == root(y); }

  int size(int x) { return siz[root(x)]; }
};
struct mint
{
  ll x; // typedef long long ll;
  mint(ll x = 0) : x((x % mod + mod) % mod) {}
  mint operator-() const { return mint(-x); }
  mint &operator+=(const mint a)
  {
    if ((x += a.x) >= mod)
      x -= mod;
    return *this;
  }
  mint &operator-=(const mint a)
  {
    if ((x += mod - a.x) >= mod)
      x -= mod;
    return *this;
  }
  mint &operator*=(const mint a)
  {
    (x *= a.x) %= mod;
    return *this;
  }
  mint operator+(const mint a) const
  {
    mint res(*this);
    return res += a;
  }
  mint operator-(const mint a) const
  {
    mint res(*this);
    return res -= a;
  }
  mint operator*(const mint a) const
  {
    mint res(*this);
    return res *= a;
  }
  mint pow(ll t) const
  {
    if (!t)
      return 1;
    mint a = pow(t >> 1);
    a *= a;
    if (t & 1)
      a *= *this;
    return a;
  }

  // for prime mod
  mint inv() const
  {
    return pow(mod - 2);
  }
  mint &operator/=(const mint a)
  {
    return (*this) *= a.inv();
  }
  mint operator/(const mint a) const
  {
    mint res(*this);
    return res /= a;
  }
};
// h(n, r) = c(n+r-1, r)
struct combination
{
  vector<mint> fact, ifact;
  combination(int n) : fact(n + 1), ifact(n + 1)
  {
    assert(n < mod);
    fact[0] = 1;
    for (int i = 1; i <= n; ++i)
      fact[i] = fact[i - 1] * i;
    ifact[n] = fact[n].inv();
    for (int i = n; i >= 1; --i)
      ifact[i - 1] = ifact[i] * i;
  }
  mint operator()(int n, int k)
  {
    if (k < 0 || k > n)
      return 0;
    return fact[n] * ifact[k] * ifact[n - k];
  }
};


int main(){
  int n;
  cin >> n;
  vector<ll> fib(n+1, 0);
  fib[0] = fib[1] = 1;
  for(int i = 2; i <= n; ++i) fib[i] = fib[i-1] + fib[i-2];
  cout << fib[n] << endl;
}