#include <cstdio>
#include <limits>

#include <cstdint>
#include <vector>
#include <string>
#include <cstdio>
#include <iostream>

unsigned long factorial1(unsigned long(*self)(unsigned long), unsigned long n) {
	return n ? n * self(n - 1) : 1;
}

template<class X, X(*Fn)(X(*)(X), X)>
struct Fix {
	static X Function(X x) {
		return Fn(Fix<X, Fn>::Function, x);
	}
};

unsigned long factorial(unsigned long n) {
	return Fix<unsigned long, factorial1>::Function(n);
};

int main() {
	std::cout << factorial(1) << '\n';
	std::cout << factorial(2) << '\n';
	std::cout << factorial(3) << '\n';
	std::cout << factorial(4) << '\n';
	std::cout << factorial(5) << '\n';
}