UOJ Logo

NOI.AC

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#199719#519. 分组游戏Anonyme100827ms18620kbC++111.2kb2023-12-19 08:27:012023-12-19 12:49:53

answer

#include<bits/stdc++.h>
using namespace std;

#define QwQ330AwA return 0
#define ll long long

const int mod = 998244353;
const int N = 2005;
int n;
int cnt[N];
int sum[N];
ll f[N][N], fac[N], inv[N];

ll ksm(ll a, int b) {
	ll ans = 1;
	for (; b; b >>= 1, a = a * a % mod) {
		if (b & 1) ans = ans * a % mod;
	}
	return ans;
}

ll C(int n, int m) {
	if (n < m) return 0;
	return fac[n] * inv[m] % mod * inv[n - m] % mod;
}

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n;
	for (int i = 1, w; i <= n; i++) cin >> w, cnt[w]++;
	for (int i = n; i >= 1; i--) sum[i] = sum[i + 1] + cnt[i]; 
	fac[0] = 1;
	for (int i = 1; i <= n; i++) fac[i] = fac[i - 1] * i % mod;
	inv[n] = ksm(fac[n], mod - 2);
	for (int i = n; i >= 1; i--) inv[i - 1] = inv[i] * i % mod;
	f[n + 1][0] = 1;
	for (int i = n; i >= 1; i--) {
		for (int j = 0; j <= sum[i + 1]; j++) {
			if (!f[i + 1][j]) continue;
			int nc = j + cnt[i];
			f[i][nc] = (f[i][nc] + f[i + 1][j]) % mod;
			ll pw = 1;
			for (int k = 1; k * i <= nc; k++) {
				pw = pw * C(nc - (k - 1) * i, i) % mod;
				f[i][nc - k * i] = (f[i][nc - k * i] + pw * f[i + 1][j] % mod * inv[k] % mod) % mod;
			}
		}
	}
	cout << f[1][0];
	QwQ330AwA;
}

详细

小提示:点击横条可展开更详细的信息

Test #1:

score: 10
Accepted
time: 0ms
memory: 1304kb

input:

10
10 8 9 1 3 6 5 5 7 3

output:

14548

result:

ok single line: '14548'

Test #2:

score: 10
Accepted
time: 0ms
memory: 1468kb

input:

50
5 27 40 10 5 46 9 17 6 12 23 41 3 37 24 26 16 17 50 9 42 25 6 34 50 19 40 47 17 28 16 21 24 50 47...

output:

64121930

result:

ok single line: '64121930'

Test #3:

score: 10
Accepted
time: 0ms
memory: 1468kb

input:

50
24 13 40 28 35 46 48 50 6 49 18 23 2 40 21 16 27 19 47 1 3 10 11 22 46 23 15 18 19 21 8 6 10 1 20...

output:

650932563

result:

ok single line: '650932563'

Test #4:

score: 10
Accepted
time: 0ms
memory: 2732kb

input:

300
203 297 19 55 127 149 228 105 201 275 277 12 77 1 105 259 274 77 274 125 164 276 217 74 29 242 1...

output:

963129383

result:

ok single line: '963129383'

Test #5:

score: 10
Accepted
time: 2ms
memory: 2740kb

input:

300
278 34 167 270 1 22 88 81 205 157 114 224 156 94 110 169 196 258 134 140 39 71 75 147 121 13 77 ...

output:

432589333

result:

ok single line: '432589333'

Test #6:

score: 10
Accepted
time: 168ms
memory: 18584kb

input:

2000
1448 1819 1531 1537 94 911 293 551 788 914 1565 456 430 313 1781 1892 1534 1296 1294 1481 520 1...

output:

826140580

result:

ok single line: '826140580'

Test #7:

score: 10
Accepted
time: 152ms
memory: 18600kb

input:

2000
1002 677 365 751 861 1332 1303 1654 1253 853 970 1165 515 342 250 291 1301 106 414 1946 1421 84...

output:

474732052

result:

ok single line: '474732052'

Test #8:

score: 10
Accepted
time: 173ms
memory: 18276kb

input:

2000
365 1326 866 1778 444 1083 454 798 762 96 17 1762 562 900 1499 81 1170 644 1103 602 71 1157 556...

output:

547036281

result:

ok single line: '547036281'

Test #9:

score: 10
Accepted
time: 168ms
memory: 18620kb

input:

2000
1697 1618 1091 656 540 1792 1788 1221 1794 303 1642 575 637 353 1519 194 693 427 1817 909 1430 ...

output:

88226629

result:

ok single line: '88226629'

Test #10:

score: 10
Accepted
time: 164ms
memory: 18500kb

input:

2000
1127 1344 1450 381 1358 623 431 912 1807 48 528 1320 483 186 1089 1051 799 1772 1686 617 1916 1...

output:

407060398

result:

ok single line: '407060398'