1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| #include <bits/stdc++.h> using namespace std; typedef long long ll;
const int maxn = 30; const int tb[] = {0, 1, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6};
ll n, p; ll fac[maxn], inv[maxn], facinv[maxn];
inline int C(int n, int m) { return fac[n] * facinv[n - m] % p * facinv[m] % p; }
ll f[maxn][maxn]; ll ans = 0;
int main() { cin >> n >> p; fac[0] = fac[1] = inv[1] = facinv[0] = facinv[1] = 1; for (int i = 2; i <= n; ++i) { inv[i] = (p - p / i) * inv[p % i] % p; fac[i] = fac[i - 1] * i % p; facinv[i] = facinv[i - 1] * inv[i] % p; } f[1][1] = 1, f[2][2] = 1; for (int i = 3; i <= n; ++i) { for (int j = 1; j <= n; ++j) { for (int x = 1; x <= i - 1; ++x) { int t1 = 0, t2 = 0; for (int k = 1; k <= j; ++k) t1 = (t1 + f[x][j - 1] * f[i - x][k] % p * C(i - 2, x - 1) % p) % p; for (int k = 1; k <= j - 2; ++k) t2 = (t2 + f[x][k] * f[i - x][j] % p * C(i - 2, x - 1) % p) % p; f[i][j] = (f[i][j] + t1 + t2) % p; } } } for (int i = 1; i <= n; ++i) ans = (ans + f[n][i] * i) % p; for (int i = 1; i <= n - 1; ++i) ans = (ans * inv[i]) % p; cout << tb[n] << endl << ans; return 0; }
|