#include #include #include using namespace std ; typedef long long ll ; vector cache ; vector p ; ll n, X, mm, calls ; ll recur(int togo, ll seen, ll X, int omit, int prev, int tobeat) { calls++ ; if (togo == 0) return 1 ; if (X < 0) return 0 ; ll key = seen + ((X * mm + prev + 1) << n) ; if (cache[key] >= 0) return cache[key] ; ll r = 0 ; for (int i=0; i> i) & 1)) continue ; int cost = 0 ; if (prev >= 0 && p[i] < p[prev]) cost = 1 ; if (cost + p[i] <= tobeat) cost = tobeat - p[i] + 1 ; if (cost * togo > X) continue ; r += recur(togo-1, seen | (1LL<> n >> X ; p.resize(n) ; for (int i=0; i> p[i] ; int hi = 0 ; mm = n + 1 ; ll cachesize = (1LL< p[hi]) hi = i ; ll r = recur(n, 0, X, hi, -1, p[hi]) ; if (argc > 1) cout << r << " " << calls << endl ; else cout << r << endl ; }