Submission #1307510

#TimeUsernameProblemLanguageResultExecution timeMemory
1307510SharkyRuins 3 (JOI20_ruins3)C++20
6 / 100
2 ms840 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int mod = 1e9 + 7; const int N = 608; int bm(int b, int p) { if (!p) return 1; int res = bm(b, p / 2); res = res * res % mod; if (p % 2 == 1) res = res * b % mod; return res; } int n, f[N << 1][N], fac[N], ifac[N], a[N << 1], sf[N << 1], g[N], fib[N][N]; int ncr(int x, int y) { if (x < y || x < 0 || y < 0) return 0; return fac[x] * ifac[y] % mod * ifac[x - y] % mod; } int32_t main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n; fac[0] = ifac[0] = 1; for (int i = 1; i <= n; i++) { fac[i] = fac[i - 1] * i % mod; ifac[i] = bm(fac[i], mod - 2); } for (int i = 1; i <= n; i++) { int val; cin >> val; a[val] = 1; } for (int i = 2 * n; i >= 1; i--) sf[i] = sf[i + 1] + a[i]; int inv = bm(2, mod - 2); g[0] = 1; for (int i = 1; i <= n; i++) for (int j = 1; j <= i; j++) g[i] += g[j - 1] * g[i - j] % mod * ncr(i - 1, j - 1) % mod * (i - j + 2) % mod; if (!a[2 * n]) return cout << "0\n", 0; f[2 * n + 1][0] = 1; for (int i = 2 * n; i >= 1; i--) { for (int j = 0; j <= n; j++) { if (a[i]) { f[i][j] = f[i + 1][j]; for (int k = 0; k < j; k++) (f[i][j] += f[i + 1][k] * g[j - k - 1] % mod * (j - k + 1) % mod * ncr(sf[i + 1] - k, j - k - 1) % mod) %= mod; } else { int num_dead = (2 * n - i) - sf[i + 1]; // cout << num_dead << '\n'; if (j > num_dead) f[i][j] = f[i + 1][j] * ((j - num_dead + mod) % mod) % mod; } // cout << "dp @ " << i << " " << j << " = " << f[i][j] << "\n"; } } cout << f[1][n] * bm(inv, n) % mod << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...