#include <stdio.h>
#include <unordered_map>
int fib(int n)
{
static std::unordered_map<int, int> db;
if(n < 2) return 1;
if(db.count(n)) return db[n];
return db[n] = fib(n - 1) + fib(n - 2);
}
int main(int ac, char **av)
{
for(int n = 0; n < 38; ++n)
printf("fib(%d) = %d\n", n, fib(n));
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgogCmludCBmaWIoaW50IG4pCnsKICBzdGF0aWMgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgaW50PiBkYjsKICBpZihuIDwgMikgcmV0dXJuIDE7CiAgaWYoZGIuY291bnQobikpIHJldHVybiBkYltuXTsKICByZXR1cm4gZGJbbl0gPSBmaWIobiAtIDEpICsgZmliKG4gLSAyKTsKfQogCmludCBtYWluKGludCBhYywgY2hhciAqKmF2KQp7CiAgZm9yKGludCBuID0gMDsgbiA8IDM4OyArK24pCiAgICBwcmludGYoImZpYiglZCkgPSAlZFxuIiwgbiwgZmliKG4pKTsKICByZXR1cm4gMDsKfQ==