Submission #1293441

#TimeUsernameProblemLanguageResultExecution timeMemory
1293441kian2009Boat (APIO16_boat)C++20
0 / 100
894 ms6572 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int MAXN = 5e2 + 10, mod = 1e9 + 7;

ll n, a[MAXN], b[MAXN], fact[MAXN], inv[MAXN], I[MAXN];
ll dp[MAXN][MAXN], f[MAXN][MAXN], ps[MAXN][MAXN];
vector<ll> num;

ll findMod(ll a, ll b) {
	if (b == 0)
		return 1;
	ll t = findMod(a, b / 2);
	if (b % 2 == 0)
		return (t * t) % mod;
	return (((t * t) % mod) * a) % mod;	
}

ll find(ll a, ll b) {
	return (a * findMod(b, mod - 2)) % mod;	
}

void calcFact() {
	fact[0] = 1;
	for (int i = 1; i < MAXN; i++) {
		fact[i] = (fact[i - 1] * i) % mod;
		I[i] = find(1, i);	
	}	
	inv[MAXN - 1] = find(1, fact[MAXN - 1]) % mod;
	for (int i = MAXN - 2; i >= 0; i--)
		inv[i] = (inv[i + 1] * (i + 1)) % mod;
}

ll crn(ll a, ll b) {
	if (b < 0 || (a < 0 || a > b))
		return 0;
	return (fact[b] * ((inv[a] * inv[b - a]) % mod)) % mod;	
}

void input() {
	cin >> n;
	num.push_back(1);
	num.push_back(1e9 + 1);
	for (int i = 0; i < n; i++) {
		cin >> a[i] >> b[i];
		num.push_back(a[i]);
		num.push_back(b[i] + 1);
	}
	sort(num.begin(), num.end());
	num.resize(unique(num.begin(), num.end()) - num.begin());
}

bool check(int i, int j) {
	return (a[i] <= num[j] && b[i] >= (num[j + 1] - 1));	
}

void calcDp() {
	for (int j = 0; j < num.size() - 1; j++) {
		ll l = num[j + 1] - num[j];
		for (int x = 1; x <= n; x++) {
			ll comb = 1;
			for (int i = 1; i <= x; i++) {
				comb = (((comb * (l - i + 1)) % mod) * I[i]) % mod;
				f[x][i] = (comb * crn(i - 1, x - 1)) % mod;
				ps[x][i] = (ps[x][i - 1] + f[x][i]) % mod;
			}
		}
		for (int i = 0; i < n; i++) {
			int cnt = 0;
			dp[j][i] = (!j? 1: dp[j - 1][i]);
			for (int k = i; k >= 0; k--) {
				if (check(k, j))
					cnt++;
				dp[j][i] = (dp[j][i] + f[cnt][cnt] * ((k == 0 || j == 0)? 1: dp[j - 1][k - 1])) % mod;
			}
		}
	}
}

int main() {
	ios::sync_with_stdio(false); cin.tie(0);
	calcFact();
	input();
	calcDp();
	cout << (dp[num.size() - 2][n - 1] - 1 + mod) % mod << endl;
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...