#include <iostream>
#include <functional>
template<class Signature>
struct recursive
{
std::function<std::function<Signature>(recursive)> f;
};
template<class R, class... Args>
using type = std::function<R(Args...)>;
template<class R, class... Args>
using f_type = std::function<type<R, Args...>(type<R, Args...>)>;
template<class R, class... Args>
type<R, Args...> helper_for(f_type<R, Args...> f)
{
recursive<R(Args...)> r = { [f](recursive<R(Args...)> rf)
{
return f([rf](Args... args){ return rf.f(rf)(args...); });
}};
return r.f(r);
}
std::function<long(long)> fuck(std::function<long(long)> f)
{
return [f](long n)->long { return (n <= 1) ? 1 : n * f(n - 1); };
}
int main()
{
auto fuck_of_fuck = helper_for(f_type<long, long>(fuck));
std::cout << fuck_of_fuck(10);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnRlbXBsYXRlPGNsYXNzIFNpZ25hdHVyZT4Kc3RydWN0IHJlY3Vyc2l2ZQp7CiAgICBzdGQ6OmZ1bmN0aW9uPHN0ZDo6ZnVuY3Rpb248U2lnbmF0dXJlPihyZWN1cnNpdmUpPiBmOwp9OwoKdGVtcGxhdGU8Y2xhc3MgUiwgY2xhc3MuLi4gQXJncz4KdXNpbmcgdHlwZSA9IHN0ZDo6ZnVuY3Rpb248UihBcmdzLi4uKT47Cgp0ZW1wbGF0ZTxjbGFzcyBSLCBjbGFzcy4uLiBBcmdzPgp1c2luZyBmX3R5cGUgPSBzdGQ6OmZ1bmN0aW9uPHR5cGU8UiwgQXJncy4uLj4odHlwZTxSLCBBcmdzLi4uPik+OwoKdGVtcGxhdGU8Y2xhc3MgUiwgY2xhc3MuLi4gQXJncz4KdHlwZTxSLCBBcmdzLi4uPiBoZWxwZXJfZm9yKGZfdHlwZTxSLCBBcmdzLi4uPiBmKQp7CiAgIHJlY3Vyc2l2ZTxSKEFyZ3MuLi4pPiByID0geyBbZl0ocmVjdXJzaXZlPFIoQXJncy4uLik+IHJmKQogICB7CiAgICAgIHJldHVybiBmKFtyZl0oQXJncy4uLiBhcmdzKXsgcmV0dXJuIHJmLmYocmYpKGFyZ3MuLi4pOyB9KTsKICAgfX07CiAgIHJldHVybiByLmYocik7Cn0KCnN0ZDo6ZnVuY3Rpb248bG9uZyhsb25nKT4gZnVjayhzdGQ6OmZ1bmN0aW9uPGxvbmcobG9uZyk+IGYpCnsKICAgcmV0dXJuIFtmXShsb25nIG4pLT5sb25nIHsgcmV0dXJuIChuIDw9IDEpID8gMSA6IG4gKiBmKG4gLSAxKTsgfTsKfQoKaW50IG1haW4oKQp7CiAgIGF1dG8gZnVja19vZl9mdWNrID0gaGVscGVyX2ZvcihmX3R5cGU8bG9uZywgbG9uZz4oZnVjaykpOwoKICAgc3RkOjpjb3V0IDw8IGZ1Y2tfb2ZfZnVjaygxMCk7Cn0=