Submission #527741

#TimeUsernameProblemLanguageResultExecution timeMemory
527741iliaMRuins 3 (JOI20_ruins3)C++17
100 / 100
357 ms35896 KiB
#include <bits/stdc++.h>
using namespace std;
#define cerr cerr << "DEBUG "

constexpr int MOD = 1000 * 1000 * 1000 + 7;

void add(int &a, int b) {
	a += b;
	if (a >= MOD) {
		a -= MOD;
	}
}

int mult(int a, int b) {
	return 1ll * a * b % MOD;
}

int inv(int n) {
	int k = MOD - 2;
	int res = 1;
	for (; k; k >>= 1, n = mult(n, n)) {
		if (k & 1) {
			res = mult(res, n);
		}
	}
	return res;
}

constexpr int N = 3e3 + 10;

int n, dp[N], p[N];
int ncr[N][N];
bool used[N];

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	
	ncr[0][0] = 1;
	for (int i = 0; i < N; ++i) {
		for (int j = 0; j < N; ++j) {
			if (i + j) {
				ncr[i][j] = (i ? ncr[i - 1][j] : 0);
				add(ncr[i][j], (i && j ? ncr[i - 1][j - 1] : 0));
			}
		}
	}

	p[0] = 1;
	for (int i = 1; i < N; ++i) {
		for (int j = 0; j < i; ++j) {
			add(p[i], mult(ncr[i - 1][j], mult(i - j + 1, mult(p[j], p[i - j - 1]))));
		}
	}
	
	cin >> n;
	for (int i = 0; i < n; ++i) {
		int x;
		cin >> x;
		used[x] = true;
	}

	dp[0] = 1;
	int cnt[2] = {};

	for (int k = n << 1; k > 0; --k) {
		if (used[k]) {
			for (int i = cnt[1] + 1; i >= 0; --i) {
				for (int j = 0; j < i; ++j) {
					add(dp[i], mult(mult(dp[j], mult(i - j + 1, p[i - j - 1])), ncr[cnt[1] - j][i - j - 1]));
				}
			}
		} else {
			for (int i = 0; i <= cnt[1]; ++i) {
				dp[i] = mult(dp[i], max(0, i - cnt[0]));
			}
		}
		cnt[used[k]]++;
		//cerr << used[k] << '\n';
		/*for (int i = 0; i <= cnt[1]; ++i) {
			cerr << "dp[" << i "] = " << dp[i] << '\n';
		}*/
	}
	
	int pw = 1;
	for (int i = 0; i < n; ++i) {
		pw = mult(pw, 2);
	}

	cout << mult(dp[n], inv(pw));
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...