#include <cstdio>                                                               

template<int n> struct Fib { enum { value = Fib<n - 1>::value + Fib<n - 2>::value }; };
template<> struct Fib<0> { enum { value = 1}; };
template<> struct Fib<1> { enum { value = 1}; };

template<int n> struct Table
{
  static int get( int i );
};

template<int n> int Table<n>::get( int i ) { return (n == i) ? Fib<n>::value : Table<n - 1>::get(i); }
template<> int Table<-1>::get( int i ) { return -1; }

int main()
{
  const int MAX = 20;

  for (int i = 0; i < MAX; i++)
    printf("%d : %d\n", i, Table<MAX>::get(i));
  return 0;
}