QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#848381 | #9995. 乒乓球赛 | Graygoo | RE | 0ms | 0kb | C++20 | 2.6kb | 2025-01-08 20:05:36 | 2025-01-08 20:05:37 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
const int MOD = 998244353;
// 快速幂计算
int quick_pow(int base, int exp) {
int result = 1;
while (exp) {
if (exp & 1) result = 1LL * result * base % MOD;
base = 1LL * base * base % MOD;
exp >>= 1;
}
return result;
}
// 预处理组合数
const int MAXN = 500000; // 最大回合数
int fact[MAXN + 1], invFact[MAXN + 1];
void precompute() {
fact[0] = 1;
for (int i = 1; i <= MAXN; i++) {
fact[i] = 1LL * fact[i - 1] * i % MOD;
}
invFact[MAXN] = quick_pow(fact[MAXN], MOD - 2);
for (int i = MAXN - 1; i >= 0; i--) {
invFact[i] = 1LL * invFact[i + 1] * (i + 1) % MOD;
}
}
int combination(int n, int k) {
if (k < 0 || k > n) return 0;
return 1LL * fact[n] * invFact[k] % MOD * invFact[n - k] % MOD;
}
// 检查是否满足比分要求
bool isValidScore(int sa, int sb) {
return (max(sa, sb) >= 11 && abs(sa - sb) >= 2);
}
// 计算合法的获胜序列数量
int solve(int n, vector<pair<int, int>>& scores) {
vector<vector<int>> dp(n + 1, vector<int>(n + 1, 0));
dp[0][0] = 1;
for (int i = 1; i <= n; i++) {
int a = scores[i - 1].first, b = scores[i - 1].second;
for (int sa = 0; sa <= n; sa++) {
for (int sb = 0; sb <= n; sb++) {
if (dp[sa][sb] == 0) continue;
if (a == -1 && b == -1) { // 当前回合未知
dp[sa + 1][sb] = (dp[sa + 1][sb] + dp[sa][sb]) % MOD;
dp[sa][sb + 1] = (dp[sa][sb + 1] + dp[sa][sb]) % MOD;
} else if (a == sa + 1 && b == sb) { // 当前回合A得分
dp[sa + 1][sb] = (dp[sa + 1][sb] + dp[sa][sb]) % MOD;
} else if (a == sa && b == sb + 1) { // 当前回合B得分
dp[sa][sb + 1] = (dp[sa][sb + 1] + dp[sa][sb]) % MOD;
}
}
}
}
int total = 0;
for (int sa = 0; sa <= n; sa++) {
for (int sb = 0; sb <= n; sb++) {
if (isValidScore(sa, sb) && sa + sb == n) {
total = (total + dp[sa][sb]) % MOD;
}
}
}
return total;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
precompute();
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
vector<pair<int, int>> scores(n);
for (int i = 0; i < n; i++) {
cin >> scores[i].first >> scores[i].second;
}
cout << solve(n, scores) << '\n';
}
return 0;
}
詳細信息
Test #1:
score: 0
Runtime Error
input:
7 11 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 11 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 11 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 11 22 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -...