#include #include using namespace std ; typedef long long ll ; const int MAXN = 64 ; ll h[MAXN], fact[MAXN], g[MAXN][MAXN], c[MAXN][MAXN] ; const ll INFTY = 2000000000000000000LL ; ll overadd(ll a, ll b) { if (a >= INFTY || b >= INFTY || a+b >= INFTY) return INFTY ; return a + b ; } ll overmul(ll a, ll b) { if (a == 0 || b == 0) return 0 ; if (a >= INFTY || b >= INFTY || a >= INFTY/b) return INFTY ; return a * b ; } ll f(int n, int m, int p) { return overmul(c[m][p], g[n-p][m-p]) ; } void findperm(vector &perm, int at, ll used, ll skip, int n, int p) { if (at == n) { if (skip != 0 || p != 0) { cout << "Failed." << endl ; exit(0) ; } return ; } for (int v=0; v> v) & 1) continue ; int pn = p - (v == at) ; if (pn < 0 || pn > n-at-1) continue ; int lft = 0 ; for (int j=at+1; j> j) & 1) == 0) lft++ ; if (pn > lft) continue ; ll cnt = f(n-at-1, lft, pn) ; if (cnt > skip) { // we have the right value perm[at] = v ; findperm(perm, at+1, used|(1LL<> n >> p >> k ; fact[0] = 1 ; for (int i=1; i= f(n, n, p)) { cout << -1 << endl ; } else { vector perm(n) ; findperm(perm, 0, 0, k, n, p) ; for (int i=0; i