#include <utility>
#include <type_traits>
namespace detail
{
template <std::size_t N>
struct factorial :
std::integral_constant<std::size_t, N * factorial<N - 1>::value>
{
};
template <>
struct factorial<0> : std::integral_constant<std::size_t, 1>
{};
template <typename T> struct factorial_seq_impl;
template <std::size_t...Is>
struct factorial_seq_impl<std::index_sequence<Is...>>{
using type = std::index_sequence<factorial<Is>::value...>;
};
}
template <std::size_t N>
using factorial_seq =
typename detail::factorial_seq_impl<std::make_index_sequence<N>>::type;
static_assert(std::is_same<std::index_sequence<1, 1, 2, 6, 24>, factorial_seq<5>>::value, "");
int main() {
}
I2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KCm5hbWVzcGFjZSBkZXRhaWwKewoKICAgIHRlbXBsYXRlIDxzdGQ6OnNpemVfdCBOPgogICAgc3RydWN0IGZhY3RvcmlhbCA6CiAgICAgICAgc3RkOjppbnRlZ3JhbF9jb25zdGFudDxzdGQ6OnNpemVfdCwgTiAqIGZhY3RvcmlhbDxOIC0gMT46OnZhbHVlPgogICAgewogICAgfTsKCiAgICB0ZW1wbGF0ZSA8PgogICAgc3RydWN0IGZhY3RvcmlhbDwwPiA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsIDE+CiAgICB7fTsKCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGZhY3RvcmlhbF9zZXFfaW1wbDsKCiAgICB0ZW1wbGF0ZSA8c3RkOjpzaXplX3QuLi5Jcz4KICAgIHN0cnVjdCBmYWN0b3JpYWxfc2VxX2ltcGw8c3RkOjppbmRleF9zZXF1ZW5jZTxJcy4uLj4+ewogICAgICAgIHVzaW5nIHR5cGUgPSBzdGQ6OmluZGV4X3NlcXVlbmNlPGZhY3RvcmlhbDxJcz46OnZhbHVlLi4uPjsKICAgIH07Cgp9Cgp0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgTj4KdXNpbmcgZmFjdG9yaWFsX3NlcSA9CiAgICB0eXBlbmFtZSBkZXRhaWw6OmZhY3RvcmlhbF9zZXFfaW1wbDxzdGQ6Om1ha2VfaW5kZXhfc2VxdWVuY2U8Tj4+Ojp0eXBlOwoKc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8c3RkOjppbmRleF9zZXF1ZW5jZTwxLCAxLCAyLCA2LCAyND4sIGZhY3RvcmlhbF9zZXE8NT4+Ojp2YWx1ZSwgIiIpOwoKaW50IG1haW4oKSB7Cn0=