#include #include #include #include using namespace std; int N; long long L, d[20][20]; const int MAX_MOD = 250; int MOD; bool tried[14][1<<14][MAX_MOD]; bool PossModP(int at, int left, int x) { if (!left) return (x + d[at][0]) % MOD == L % MOD; bool &t = tried[at][left][x]; if (!t) { t = true; for (int i = 1; i < N; ++i) if ((left & (1< 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<