#include <iostream>
#include <iterator>
#include <algorithm>
#include <cmath>
using namespace std;
class Fibonacci
{
private:
vector<int> A;
public:
Fibonacci(unsigned int n) {
A.push_back(1);
A.push_back(1);
Set(n);
}
void Set(const unsigned int n) {
for (unsigned int i=A.size()-1; i<n; i++) {
A.push_back(A[i] + A[i-1]);
}
}
int operator()(unsigned int k) {
if (k-1 > A.size()) {
Set(k-1);
}
return A[k-1];
}
};
class B
{
private:
unsigned int M;
vector<int> B;
Fibonacci A;
public:
B(unsigned int m) : M(m), A(30) {
B.push_back(m-1);
Set(30);
}
void Set(const unsigned int n) {
for (unsigned int i=B.size()-1; i<n; i++) {
B.push_back(B);
}
}
int operator()(unsigned int k) {
if (k-1 > A.size()) {
Set(k-1);
}
return A[k-1];
}
};
int main()
{
Fibonacci a(10);
cout << a(4) << endl;
return 0;
}