#include #include #include using namespace std; int N; long long L, d[20][20]; const int MAX_VALS = 30; struct data { long long lo, hi; set values; }; data drange[15][1<<15]; const data &DRange(int at, int left, int end) { if (!left) { drange[at][left].lo = drange[at][left].hi = d[at][end]; drange[at][left].values.clear(); drange[at][left].values.insert(d[at][end]); return drange[at][left]; } data &res = drange[at][left]; if (res.lo == -1) { res.lo = 1<<30; res.hi = 0; res.values.clear(); for (int i = 1; i < N; ++i) if ((left & (1< MAX_VALS) break; res.values.insert(d[at][i]+x); } } } return res; } bool Poss(int at, int left, int end, long long T) { if (!left) return d[at][end] == T; const data &R = DRange(at, left, end); if (T < R.lo || T > R.hi) return false; if (T == R.lo || T == R.hi || R.values.find(T) != R.values.end()) return true; if (R.values.size() < MAX_VALS) return false; for (int i = 1; i < N; ++i) if ((left & (1<