QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#883862 | #6410. Classical DP Problem | zhenghanyun | WA | 0ms | 5944kb | C++14 | 1.9kb | 2025-02-05 19:27:51 | 2025-02-05 19:27:52 |
Judging History
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;
}
Details
Tip: Click on the bar to expand more detailed information
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'