题解:P6017 [CSGRound3] 仙人掌
Priestess_SLG · · 题解
特判
然后考虑怎么判度数序列是否可以组成仙人掌。这个东西考虑给奇数度数点配对,如果两个点度数至少一个不为 但是我懒得想了。
namespace lowspeed_song {
mt19937_64 mt(time(0));
int fac[N], inv[N], ifac[N];
inline void init() {
fac[0] = inv[0] = ifac[0] = 1;
fac[1] = inv[1] = ifac[1] = 1;
for (int i = 2; i < N; ++i) {
fac[i] = fac[i - 1] * i % mod;
inv[i] = mod - inv[mod % i] * (mod / i) % mod;
ifac[i] = ifac[i - 1] * inv[i] % mod;
}
}
inline int binom(int a, int b) {
if (b < 0 || a < b) return 0;
return fac[a] * ifac[b] % mod * ifac[a - b] % mod;
}
inline void sol([[maybe_unused]]int __testcase_id, [[maybe_unused]]int __testcase_sum) {
int n, m; cin >> n >> m;
if (m > n + (n - 3) / 2 || m < n - 1) cout << 0 << '\n';
else {
if (!n) cout << 0 << '\n';
else if (n == 1) {
if (!m) cout << 1 << '\n';
else cout << 0 << '\n';
} else if (n == 2) {
if (m == 1) cout << 1 << '\n';
else cout << 0 << '\n';
} else {
int res = 0;
for (int i = 0; i < n; ++i)
for (int j = (i & 1); j <= n - i; j += 2) {
int rmv = max(i, (i + j) / 2);
if (n - rmv >= 2 * (m - n + 1) + 1) {
int nn = n - i, nm = m - (i + j) / 2;
if (nn <= nm) addmod(res, binom(n, i) * binom(nn, j) % mod * binom(nm - 1, nn - 1) % mod);
}
}
cout << res << '\n';
}
}
}
} // namespace lowspeed_song