#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 600, K = 1200;
const ll MOD = 1'000'000'007;
int n, k, mark[K + 10], s[K + 10];
ll preDP[N + 10][N + 10], pre[N + 10];
ll dp[K + 10][N + 10];
ll fact[N + 10], invFact[N + 10];
void readInput() {
cin >> n;
k = n + n;
for (int i = 1; i <= n; i++) {
int a;
cin >> a;
mark[a] = i;
}
}
bool checkFirst() {
return !mark[1] && mark[k];
}
ll power(ll x, ll k) {
ll pw = x, res = 1;
while (k) {
if (k & 1)
res = res * pw % MOD;
k >>= 1;
pw = pw * pw % MOD;
}
return res;
}
void calcFact() {
fact[0] = invFact[0] = 1;
for (int i = 1; i <= n; i++) {
fact[i] = fact[i - 1] * i % MOD;
invFact[i] = power(fact[i], MOD - 2);
}
}
ll C(int n, int r) {
if (n < r || r < 0 || n < 0)
return 0;
return (fact[n] * invFact[n - r] % MOD) * invFact[r] % MOD;
}
void calcS() {
s[k + 1] = 0;
for (int i = k; i >= 1; i--)
s[i] = s[i + 1] + (mark[i] == 0);
}
void calcPreDP() {
preDP[0][0] = 1;
for (int i = 1; i <= n; i++) {
preDP[i][0] = 1;
for (int j = 1; j <= i; j++) {
ll case1 = preDP[i - 1][j];
ll case2 = 2ll * preDP[i - 1][j - 1] % MOD;
ll case3 = (2 <= j? preDP[i - 1][j - 2]: 0);
preDP[i][j] = (case1 + case2 + case3) % MOD;
}
}
}
void calcPre() {
calcPreDP();
for (int i = 1; i <= n; i++)
pre[i] = (preDP[i - 1][i - 1] * fact[i - 1] % MOD) * (ll) (i + 1) % MOD;
}
void calcDP() {
int cnt = 0;
dp[k + 1][0] = 1;
for (int i = k; i >= 1; i--) {
cnt += (mark[i] != 0);
for (int l = 0; l <= cnt; l++) {
if (!mark[i]) {
int remain = 2 * l - (k - i - cnt) - l;
dp[i][l] = (ll) max(0, remain) * dp[i + 1][l] % MOD;
continue;
}
dp[i][l] = dp[i + 1][l];
for (int j = 1; j <= l; j++) {
ll case1 = C(cnt - (l - j) - 1 , j - 1);
ll case2 = pre[j] * dp[i + 1][l - j] % MOD;
ll tmp = case1 * case2 % MOD;
dp[i][l] = (dp[i][l] + tmp) % MOD;
}
}
}
}
void writeOutput() {
ll ans = dp[1][n];
cout << ans * power(power(2, n), MOD - 2) % MOD << flush;
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
readInput();
calcFact();
calcS();
calcPre();
calcDP();
writeOutput();
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |