用C++完成符合以下条件的代码,输入格式: 第一行输入一个整数 t(1≤t≤10的3次方),表示数据组数。 第二行输入两个整数 n,m(1≤n,m≤10的5次方),表示可怜以外的玩家数量以及可怜规划的夜晚数量。 接下来 m 行每行两个整数 第i个l, 第i个r (1≤第i个l ≤第i个r ≤n),表示可怜的计划中在第 i 晚会被选中的玩家编号区间。 输入保证所有数据中满足 n>10的3次方或m>10的3次方 的数据不超过 5 组。 输出格式: 对于每组数据,输出一行一个整数,表示满足条件的可能性数量。答案可能很大,你只需要输出对 998244353 取模后的结果。 输入样例: 3 4 1 2 3 5 4 2 5 1 3 5 5 2 4 10 10 1 2 6 6 3 7 3 6 1 8 9 10 1 6 4 4 8 8 5 8 输出样例: 1 2 7 样例解释 在第一组数据中,可怜得到的信息共有两种可能性: 得到的信息为 0,表明两名目标的玩家均不在区间 [2,3] 中,因此可以唯一确定他们的编号为 (1,4)。 得到的信息为 1,表明至少有一名目标的玩家在区间 [2,3] 中,此时共有四种可能性 (1,2),(1,3),(2,4),(3,4),因此不能唯一确定。 在第二组数据中,满足要求的两种可能性如下所示: 四天得到的信息依次为 1110,此时目标玩家的编号一定为 (1,5)。 四天得到的信息依次为 1011,此时目标玩家的编号一定为 (4,5)。 容易验证其他 14 种可能性均不满足条件。
时间: 2024-04-16 19:28:33 浏览: 153
以下是用C++完成符合条件的代码:
```cpp
#include <iostream>
#include <vector>
#define MOD 998244353
using namespace std;
// 计算幂的函数
long long power(long long x, long long y) {
long long result = 1;
while (y > 0) {
if (y % 2 == 1) {
result = (result * x) % MOD;
}
x = (x * x) % MOD;
y /= 2;
}
return result;
}
// 计算阶乘的函数
long long factorial(long long n) {
long long result = 1;
for (int i = 2; i <= n; i++) {
result = (result * i) % MOD;
}
return result;
}
int main() {
int t;
cin >> t;
while (t--) {
int n, m;
cin >> n >> m;
vector<pair<int, int>> intervals(m); // 存储每晚的玩家编号区间
for (int i = 0; i < m; i++) {
cin >> intervals[i].first >> intervals[i].second;
}
vector<long long> possibilities(m + 1); // 存储每晚可能性的数量
possibilities[m] = 1;
for (int i = m - 1; i >= 0; i--) {
int l = intervals[i].first;
int r = intervals[i].second;
// 计算当前晚的可能性数量
possibilities[i] = (possibilities[i + 1] * (r - l + 1)) % MOD;
// 减去不满足条件的可能性数量
for (int j = i + 1; j < m; j++) {
int l2 = intervals[j].first;
int r2 = intervals[j].second;
if (l <= r2 && l2 <= r) {
possibilities[i] = (possibilities[i] - possibilities[j + 1] + MOD) % MOD;
}
}
}
long long result = (factorial(n) * power(factorial(n - m), MOD - 2)) % MOD;
result = (result * possibilities[0]) % MOD;
cout << result << endl;
}
return 0;
}
```
希望能帮助到你!
阅读全文