记录编号 |
600852 |
评测结果 |
AAWAA |
题目名称 |
[HSOI 2020] UNO |
最终得分 |
80 |
用户昵称 |
健康铀 |
是否通过 |
未通过 |
代码语言 |
C++ |
运行时间 |
0.667 s |
提交时间 |
2025-05-19 21:26:38 |
内存使用 |
34.38 MiB |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll p = 998244353;
const ll maxn = 2005000;
ll n, m, k, ans;
ll fac[maxn], inv[maxn];
inline ll C(ll a, ll b) {
if (a < b || b < 0) return 0;
return fac[a] * inv[b] % p * inv[a - b] % p;
}
ll G(int n, int m, int i) {
if ((n - m + i) % 2 != 0) {
ll term1 = C(n - 1, (n - m + i + 1) / 2) * C(m - 1, i - (n - m + i + 1) / 2) % p;
ll term2 = C(n - 1, (n - m + i - 1) / 2) * C(m - 1, i - (n - m + i - 1) / 2) % p;
return (term1 + term2) % p;
}
else {
return 2 * C(n - 1, (n - m + i) / 2) % p * C(m - 1, ((i - (n - m + i) / 2)%p) ) % p;
}
}
void init(ll max_val) {
fac[0] = inv[0] = 1;
for (ll i = 1; i <= max_val; ++i) {
fac[i] = fac[i - 1] * i % p;
}
inv[1] = 1;
for (ll i = 2; i <= max_val; ++i) {
inv[i] = (p - p / i) * inv[p % i] % p;
}
for (ll i = 2; i <= max_val; ++i) {
inv[i] = inv[i - 1] * inv[i] % p;
}
}
void work() {
ans = 0;
for (int i = 0; i <= n; ++i) {
ll g_val = G(m, k, i);
ll c_val = C(m + k + 1 - i, n - i);
ans = (ans + g_val * c_val % p) % p;
}
printf("%lld\n", ans);
}
int main() {
freopen("UNO.in", "r", stdin);
freopen("UNO.out", "w", stdout);
scanf("%lld%lld%lld", &n, &m, &k);
init(2000000);
work();
return 0;
}