记录编号 600852 评测结果 AAWAA
题目名称 [HSOI 2020] UNO 最终得分 80
用户昵称 Gravatar健康铀 是否通过 未通过
代码语言 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;
}