比赛 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;
}