#include <stdio.h>
#define MAX_FACTORIAL_SIZE 100
unsigned long long factorial(unsigned long long n) {
static unsigned long long result[MAX_FACTORIAL_SIZE] = { 0ULL };
if (n == 0ULL || n == 1ULL) {
result[n] = 1ULL;
}
else if (result[n] == 0ULL) {
result[n] = n * factorial(n - 1ULL);
}
return result[n];
}
int main() {
for (unsigned long long i = 0; i < (unsigned long long)MAX_FACTORIAL_SIZE; ++i) {
printf("%llu: %llu\n", i, factorial(i));
}
return 0;
}