#include <iostream>
template<typename F> unsigned fact(int i, F&& f) {
if(i == 0)
return 1;
return i * f(i - 1);
}
struct fact_doubler {
unsigned operator()(unsigned i) {
return 2 * fact(i, *this);
}
};
int main() {
fact_doubler f;
std::cout << f(5);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8dHlwZW5hbWUgRj4gdW5zaWduZWQgZmFjdChpbnQgaSwgRiYmIGYpIHsKICAgIGlmKGkgPT0gMCkKICAgICAgICByZXR1cm4gMTsKICAgIHJldHVybiBpICogZihpIC0gMSk7Cn0Kc3RydWN0IGZhY3RfZG91YmxlciB7CiAgICB1bnNpZ25lZCBvcGVyYXRvcigpKHVuc2lnbmVkIGkpIHsKICAgICAgICByZXR1cm4gMiAqIGZhY3QoaSwgKnRoaXMpOwogICAgfQp9OwppbnQgbWFpbigpIHsKICAgIGZhY3RfZG91YmxlciBmOwogICAgc3RkOjpjb3V0IDw8IGYoNSk7Cn0=