| 比赛 |
2025.12.6 |
评测结果 |
WAWWWWWWWW |
| 题目名称 |
分组游戏 |
最终得分 |
10 |
| 用户昵称 |
淮淮清子 |
运行时间 |
0.191 s |
| 代码语言 |
C++ |
内存使用 |
15.85 MiB |
| 提交时间 |
2025-12-06 11:27:54 |
显示代码纯文本
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 2e3 + 5;
const int MOD = 998244353;
int C[N][N], n, a[N], dp[N];
int gc, gs[10], gm[10][10], res;
void Init(){
C[0][0] = 1;
for(int i = 1;i < N; ++ i){
C[i][0] = C[i][i] = 1;
for(int j = 1;j < i;++ j)
C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % MOD;
}
}
void dfs(int x){
if(x > n){
for(int g = 0;g < gc;++ g){
int s = gs[g];
for(int i = 0;i < s;++ i){
if(s > a[gm[g][i]]) return;
}
}
res ++;
return;
}
gm[gc][0] = x;
gs[gc ++] = 1;
dfs(x + 1);
gc --;
for(int g = 0;g < gc;++ g){
gm[g][gs[g] ++] = x;
dfs(x + 1);
gs[g] --;
}
}
int baoli(){
gc = res = 0;
dfs(1);
return res;
}
int main(){
freopen("gamem.in", "r", stdin);
freopen("gamem.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for(int i = 1; i <= n; ++i) cin >> a[i];
sort(a + 1, a + n + 1, [](int x, int y){return x > y;});
if(n <= 10){
cout << baoli() << '\n';
return 0;
}
Init();
dp[0] = 1;
for(int i = 1;i <= n;++ i){
int l = a[i], mk = min(l, i);
for(int k = 1;k <= mk;++ k){
dp[i] = (dp[i] + 1LL * dp[i - k] * C[i - 1][k - 1]) % MOD;
}
}
cout << dp[n] << '\n';
return 0;
}