UOJ Logo

NOI.AC

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#204014#2791. 历史tkswls1002173ms5964kbC++111.5kb2024-04-02 08:25:452024-04-02 21:17:41

answer

#include <bits/stdc++.h>
#pragma GCC optimize(2)
#define int long long
const int mod = 998244353;
using namespace std;
int n, val[105], m, f[105][105][105], jie[5005], inv[5005];
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 < 0 || q < 0 || 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);
	jie[0] = inv[0] = 1;
	for (int i = 1; i <= 5000; i++) {
		jie[i] = jie[i - 1] * i % mod;
		inv[i] = ksm(jie[i]);
	}
	cin >> n;
	int p;
	for (int i = 1; i <= n; i++) {
		cin >> p;
		val[p]++;
	}
	for (int i = 1; i <= 100; i++) {
		if (val[i]) val[++m] = val[i];
	}
	f[0][0][0] = 1;
	int ans = 0;
	for (int i = 1; i <= m; i++) {
		for (int j = 0; j <= i; j++) {//选了多少
			for (int k = 0; k <= m; k++) { //覆盖了多少,定义为第一次出现到最后一次附加的段数
				f[i][j][k] = f[i - 1][j][k];
				if (j) {
					for (int p = 1; p <= k; p++) {
						if (p == 1)f[i][j][k] = (f[i][j][k] + f[i - 1][j - 1][k - 1]  * j % mod) % mod;
						else f[i][j][k] = (f[i][j][k] + f[i - 1][j - 1][k - p] * C(val[i] + p - 3, p - 1) % mod * j % mod) % mod;
					}
				}
			}
		}
	}
	ans = 0;
	for (int i = 1; i <= m; i++) {
		ans = (ans + f[m][i][m] * jie[m - i] % mod) % mod;
	}
	for (int i = 1; i <= m; i++) ans = ans * jie[val[i]] % mod;
	cout << ans;
}

这程序好像有点Bug,我给组数据试试?

详细

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

Test #1:

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

input:

10
3 4 1 10 3 7 2 5 4 1

output:

612864

result:

ok "612864"

Test #2:

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

input:

10
4 1 2 3 7 3 2 3 8 3

output:

959616

result:

ok "959616"

Test #3:

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

input:

3000
3 3 8 2 3 5 2 2 4 1 1 3 8 1 6 7 1 1 2 10 1 9 3 3 2 3 2 2 1 3 1 1 6 1 7 10 1 9 7 2 1 3 1 2 6 3 1...

output:

111394605

result:

ok "111394605"

Test #4:

score: 10
Accepted
time: 368ms
memory: 5964kb

input:

5000
18 23 31 2 41 20 3 1 49 28 10 1 25 2 55 1 4 1 15 38 45 1 87 55 49 2 30 1 92 3 37 1 68 10 3 20 5...

output:

562512735

result:

ok "562512735"

Test #5:

score: 10
Accepted
time: 41ms
memory: 3444kb

input:

300
5 47 17 16 1 20 1 15 7 14 4 38 19 59 1 74 4 57 1 1 11 1 3 1 6 31 98 4 12 5 40 4 16 9 1 29 4 18 1...

output:

926527742

result:

ok "926527742"

Test #6:

score: 10
Accepted
time: 143ms
memory: 5784kb

input:

99
1 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 3...

output:

509457672

result:

ok "509457672"

Test #7:

score: 10
Accepted
time: 405ms
memory: 5964kb

input:

5000
1 2 3 24 4 1 5 16 3 6 36 10 1 3 55 42 2 2 1 1 2 97 3 2 44 10 14 6 1 1 11 62 8 14 3 3 60 1 2 6 1...

output:

502114207

result:

ok "502114207"

Test #8:

score: 10
Accepted
time: 407ms
memory: 5964kb

input:

5000
45 9 6 3 1 5 3 56 5 24 1 26 36 3 1 56 5 21 2 24 41 3 45 24 23 13 93 1 2 4 6 3 3 2 30 4 8 1 1 3 ...

output:

434274969

result:

ok "434274969"

Test #9:

score: 10
Accepted
time: 403ms
memory: 5964kb

input:

5000
2 27 18 2 25 12 43 1 5 10 3 16 4 6 64 3 63 86 1 1 2 4 27 13 1 3 8 39 5 2 23 6 15 30 94 1 20 27 ...

output:

829057783

result:

ok "829057783"

Test #10:

score: 10
Accepted
time: 402ms
memory: 5960kb

input:

5000
3 10 4 12 49 10 1 1 14 5 10 73 4 41 56 18 16 1 4 6 2 1 5 4 14 2 7 7 32 5 34 44 14 37 48 45 2 6 ...

output:

133737347

result:

ok "133737347"

Extra Test:

score: 0
Extra Test Passed