Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
37029 | a+qazolite | 【S】T4 | C++ | 通过 | 100 | 392 MS | 156508 KB | 2020 | 2025-03-02 13:17:23 |
// Author: Aquizahv #include <bits/stdc++.h> #define ll long long using namespace std; const int N = 2e7 + 5, MOD = 998244353; int r, g, b; int fac[N], inv[N]; inline int A(int x, int y) { return (x + y) % MOD; } inline int S(int x, int y) { return A(x, MOD - y); } inline int W(int x, int y) { return 1ll * x * y % MOD; } inline int P(int x, int y) { int res = 1, t = x % MOD; while (y) { if (y & 1) res = W(res, t); t = W(t, t); y >>= 1; } return res; } inline int D(int x, int y) { return W(x, P(y, MOD - 2)); } void init(int lmt) { fac[0] = inv[0] = 1; for (int i = 1; i <= lmt; i++) fac[i] = W(fac[i - 1], i); inv[lmt] = D(1, fac[lmt]); for (int i = lmt - 1; i >= 1; i--) inv[i] = W(inv[i + 1], i + 1); } inline int C(int x, int y) { if (x < y) return 0; return W(fac[x], W(inv[x - y], inv[y])); } int main() { init(2e7); scanf("%*d%d%d%d", &r, &g, &b); if (g == 0 && b == 0) puts(r == 1 ? "1" : "0"); else if (g == 0 || b == 0) { g += b; if (g == r) puts("2"); else if (abs(g - r) == 1) puts("1"); else puts("0"); } else { int ans = 0; for (int i = 0; i <= r && i <= g + b - 1; i++) { int t;//, lst = ans; if ((g + b - i) & 1) { t = W(C(g - 1, (g + b - i + 1) / 2 - 1), C(b - 1, (g + b - i - 1) / 2 - 1)); t = A(t, W(C(g - 1, (g + b - i - 1) / 2 - 1), C(b - 1, (g + b - i + 1) / 2 - 1))); } else { t = W(C(g - 1, (g + b - i) / 2 - 1), C(b - 1, (g + b - i) / 2 - 1)); t = A(t, t); } ans = A(ans, W(t, C(g + b + 1 - i, r - i))); // cout << i << ' ' << t << endl; } cout << ans << endl; } return 0; }