Submission #1209865

#TimeUsernameProblemLanguageResultExecution timeMemory
1209865k1r1t0Boat (APIO16_boat)C++20
100 / 100
509 ms8600 KiB
#include <bits/stdc++.h>

using namespace std;
#define int long long

const int N = 1100;
const int MOD = (int)(1e9+7);

int n, m, a[N], b[N], dp[N][N], vv[N];
vector<int> pos;

void init() {
	for (int i = 1; i < N; i++)
		vv[i] = (i == 1 ? 1 : MOD - MOD / i * vv[MOD % i] % MOD);
}

int sz(int k) {
	return pos[k] - pos[k - 1];
}

int32_t main() {
	ios::sync_with_stdio(0); cin.tie(0);
	init();
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i] >> b[i];
		pos.push_back(a[i]);
		pos.push_back(b[i] + 1);
	}
	sort(begin(pos), end(pos));
	pos.erase(unique(begin(pos), end(pos)), end(pos));
	m = (int) pos.size() - 1;
	for (int i = 1; i <= n; i++) {
		int sum = 1;
		for (int j = 1; j <= m; j++) {
			int old = 0;
			for (int k = 1; k <= n; k++)
				old += dp[j][k];
			if (a[i] <= pos[j - 1] && pos[j] <= b[i] + 1) {
				for (int k = n; k >= 1; k--)
					if (k == 1)
						(dp[j][k] += sum * sz(j)) %= MOD;
					else
						(dp[j][k] += dp[j][k - 1] * (sz(j) - k + 1) % MOD * vv[k]) %= MOD;
			}
			(sum += old) %= MOD;
		}
	}
	int ans = 0;
	for (int i = 1; i <= m; i++)
	for (int j = 1; j <= n; j++)
		(ans += dp[i][j]) %= MOD;
	cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...