QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#883862#6410. Classical DP ProblemzhenghanyunWA 0ms5944kbC++141.9kb2025-02-05 19:27:512025-02-05 19:27:52

Judging History

This is the latest submission verdict.

  • [2025-02-05 19:27:52]
  • Judged
  • Verdict: WA
  • Time: 0ms
  • Memory: 5944kb
  • [2025-02-05 19:27:51]
  • Submitted

answer

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

typedef long long ll;

const int N = 5005;
const ll mod = 998244353;

ll fac[N], ifac[N];

inline void get_fac(ll n) {
	fac[0] = 1;
	for (int i = 1; i <= n; ++i) {
		fac[i] = fac[i - 1] * i % mod;
	}
	ifac[0] = ifac[1] = 1;
	for (int i = 2; i <= n; ++i) {
		ifac[i] = (mod - mod / i) * ifac[mod % i] % mod;
	}
	for (int i = 1; i <= n; ++i) {
		ifac[i] = ifac[i] * ifac[i - 1] % mod;
	}
}

inline ll A(ll n, ll m) {
	if (n < m) {
		return 0;
	}
	return fac[n] * ifac[n - m] % mod;
}

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

inline void addmod(ll &x) {
	(x >= mod) && (x -= mod);
}

int n, m, a[N], b[N];

ll f[N][N], g[N][N], ans;

inline ll calc1(ll k) {
	f[0][0] = 1;
	for (int i = 1; i <= m; ++i) {
		for (int j = 0; j <= k; ++j) {
			(f[i][j] += f[i - 1][j] * (j + a[i] - k)) %= mod;
			if (j > 0) {
				(f[i][j] += f[i - 1][j - 1] * (k - j + 1)) %= mod;
			}
		}
	}
	return f[m][k];
}

inline ll calc2(ll k) {
	g[0][0] = 1;
	for (int i = 1; i <= m; ++i) {
		for (int j = 0; j <= k; ++j) {
			(g[i][j] += g[i - 1][j] * (j + b[i] - k)) %= mod;
			if (j > 0) {
				(g[i][j] += g[i - 1][j - 1] * (k - j + 1)) %= mod;
			}
		}
	}
	return g[m][k];
}

int main() {
#ifdef LOCAL
	assert(freopen("test.in", "r", stdin));
	assert(freopen("test.out", "w", stdout));
#endif
	ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
	get_fac(5000);
	cin >> n;
	for (int i = 1; i <= n; ++i) {
		cin >> a[i];
		++b[a[i]];
	}
	for (int i = 1; i <= n; ++i) {
		b[i] += b[i - 1];
	}
	reverse(a + 1, a + n + 1);
	reverse(b + 1, b + n + 1);
	for (int i = 1; i <= n; ++i) {
		m = max(m, min(a[i], i));
	}
	addmod(ans = calc1(a[m + 1]) + calc2(b[m + 1]));
	addmod(ans += mod - fac[m]);
	cout << m << " " << ans << "\n";
	return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 0ms
memory: 5944kb

input:

3
1 2 3

output:

2 6

result:

ok 2 number(s): "2 6"

Test #2:

score: 0
Accepted
time: 0ms
memory: 5824kb

input:

1
1

output:

1 1

result:

ok 2 number(s): "1 1"

Test #3:

score: -100
Wrong Answer
time: 0ms
memory: 5816kb

input:

2
1 1

output:

1 0

result:

wrong answer 2nd numbers differ - expected: '2', found: '0'