int n, mod; int fac[kMaxN], ifac[kMaxN], f[kMaxN][kMaxN][kMaxN];
constexprintqpow(int bs, int64_t idx = mod - 2){ int ret = 1; for (; idx; idx >>= 1, bs = (int64_t)bs * bs % mod) if (idx & 1) ret = (int64_t)ret * bs % mod; return ret; }
inlineintadd(int x, int y){ return (x + y >= mod ? x + y - mod : x + y); } inlineintsub(int x, int y){ return (x >= y ? x - y : x - y + mod); } inlinevoidinc(int &x, int y){ (x += y) >= mod ? x -= mod : x; } inlinevoiddec(int &x, int y){ (x -= y) < 0 ? x += mod : x; }
voidprework(){ fac[0] = ifac[0] = fac[1] = ifac[1] = 1; for (int i = 2; i <= n + 1; ++i) { fac[i] = 1ll * i * fac[i - 1] % mod; ifac[i] = qpow(fac[i]); } }
voiddickdreamer(){ std::cin >> n >> mod; prework(); int ans = 1; for (int a1 = std::max<int>(n - 18, 1); a1 <= n; ++a1) { for (int i = 0; i <= n; ++i) for (int j = 0; j <= a1; ++j) for (int k = 0; k <= n - a1 + 1; ++k) f[i][j][k] = 0; for (int i = 1; i <= a1; ++i) { f[i][0][0] = 1ll * fac[n] * ifac[i] % mod; } for (int k = 1; k <= n - a1 + 1; ++k) { for (int i = 1; i <= n; ++i) { for (int j = 0; j <= a1; ++j) { for (int cnt = 0; cnt <= std::min(n - i, (a1 - j) / k); ++cnt) { if (k >= i + cnt - a1 + 1) { inc(f[i + cnt][j + cnt * k][k], 1ll * f[i][j][k - 1] * ifac[cnt] % mod); } } } } } for (int i = 0; i <= a1; ++i) inc(ans, f[n][i][n - a1 + 1]); } std::cout << ans << '\n'; }