#include <vector>
#include <iostream>
unsigned factorial(unsigned index) {
static std::vector<unsigned> cache(2, 1);
if (index >= cache.size())
cache.push_back(factorial(index-1)*index);
return cache[index];
}
int main() {
std::cout << factorial(0) << '\n';
std::cout << factorial(1) << '\n';
std::cout << factorial(2) << '\n';
std::cout << factorial(3) << '\n';
std::cout << factorial(5) << '\n';
std::cout << factorial(33) << '\n';
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgogCnVuc2lnbmVkIGZhY3RvcmlhbCh1bnNpZ25lZCBpbmRleCkgewogICAgc3RhdGljIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBjYWNoZSgyLCAxKTsKICAgIGlmIChpbmRleCA+PSBjYWNoZS5zaXplKCkpCiAgICAgICAgY2FjaGUucHVzaF9iYWNrKGZhY3RvcmlhbChpbmRleC0xKSppbmRleCk7CiAgICByZXR1cm4gY2FjaGVbaW5kZXhdOwp9CiAKaW50IG1haW4oKSB7CiAgIHN0ZDo6Y291dCA8PCBmYWN0b3JpYWwoMCkgPDwgJ1xuJzsKICAgc3RkOjpjb3V0IDw8IGZhY3RvcmlhbCgxKSA8PCAnXG4nOwogICBzdGQ6OmNvdXQgPDwgZmFjdG9yaWFsKDIpIDw8ICdcbic7CiAgIHN0ZDo6Y291dCA8PCBmYWN0b3JpYWwoMykgPDwgJ1xuJzsKICAgc3RkOjpjb3V0IDw8IGZhY3RvcmlhbCg1KSA8PCAnXG4nOwogICBzdGQ6OmNvdXQgPDwgZmFjdG9yaWFsKDMzKSA8PCAnXG4nOwp9