UOJ Logo

NOI.AC

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#197147#2378. 打怪升级tkswls1001035ms380768kbC++111.2kb2023-11-07 10:50:352023-11-07 12:11:00

answer

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 998244353;
int n, m, a[5005], sum, jie[30000007], inv[30000007], f[5005][5005], ssum[5005], cnt;
inline int ksm(int p, int q = mod - 2) {
	int base = 1;
	while (q) {
		if (q & 1) base = base * p % mod;
		q >>= 1;
		p = p * p % mod;
	}
	return base;
}
inline int C(int p, int q) {
	if (p < q) return 0;
	return jie[p] * inv[q] % mod * inv[p - q] % mod;
}
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		sum += a[i];
		ssum[i] = ssum[i - 1] + a[i];
	}
	cnt = sum;
	sum += 2 * n - m;
	jie[0] = jie[1] = 1;
	for (int i = 2; i <= sum; i++) {
		jie[i] = jie[i - 1] * i % mod;
	}
	inv[sum] = ksm(jie[sum]);
	for (int i = sum - 1; i >= 0; i--) {
		inv[i] = (inv[i + 1] * (i + 1)) % mod;
	}
	f[m][0] = 1;
	for (int i = m; i <= n; i++) {
		for (int j = 0 + (i == m); j <= n; j++) {
			if (j > i) f[i][j] = 0;
			else f[i][j] = f[i][j - 1] * C(cnt - ssum[j - 1] + n - (j) + (n - i), a[j]) % mod + f[i - 1][j];
			f[i][j] %= mod;
		}
//		for (int j = 0; j <= n; j++) {
//			cout << f[i][j] << ' ';
///		}
//		cout << endl;
	}
	cout << f[n][n];
}

详细

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

Test #1:

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

input:

5 2
1 1 1 1 1

output:

54120

result:

ok 1 number(s): "54120"

Test #2:

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

input:

10 3
1 1 1 1 1 1 1 1 1 1

output:

836587775

result:

ok 1 number(s): "836587775"

Test #3:

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

input:

10 10
10 5 2 4 7 3 10 5 7 7

output:

170231657

result:

ok 1 number(s): "170231657"

Test #4:

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

input:

10 3
10 2 3 4 10 10 7 3 8 2

output:

43852022

result:

ok 1 number(s): "43852022"

Test #5:

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

input:

200 70
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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1...

output:

664926161

result:

ok 1 number(s): "664926161"

Test #6:

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

input:

200 200
141 25 82 146 124 14 47 152 97 41 98 163 106 96 104 58 100 8 187 68 188 34 70 46 47 136 175 ...

output:

833745003

result:

ok 1 number(s): "833745003"

Test #7:

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

input:

200 60
37 196 175 170 177 163 44 149 101 1 38 118 115 95 1 160 176 66 150 35 143 92 69 184 62 47 101...

output:

229896301

result:

ok 1 number(s): "229896301"

Test #8:

score: 10
Accepted
time: 139ms
memory: 187656kb

input:

5000 242
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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1...

output:

73699446

result:

ok 1 number(s): "73699446"

Test #9:

score: 10
Accepted
time: 133ms
memory: 196304kb

input:

5000 5000
1476 1811 2326 1822 4078 1233 1963 22 578 3272 2675 3 2718 4394 1967 1391 1542 14 2996 975...

output:

447854096

result:

ok 1 number(s): "447854096"

Test #10:

score: 10
Accepted
time: 763ms
memory: 380768kb

input:

5000 245
3269 4477 2256 420 412 2380 2449 1395 846 4830 2633 1514 2584 2319 1080 2725 672 3317 1741 ...

output:

340029830

result:

ok 1 number(s): "340029830"

Extra Test:

score: 0
Extra Test Passed