#include<bits/stdc++.h>
using namespace std;
const int MAXN = 503;
const int MOD = 1e9 + 7;
#define int long long
int n, l[MAXN], r[MAXN], dp[MAXN][MAXN * 2], inv[MAXN];
vector<int> vt;
vector<pair<int, int>> segment;
int pw(int a, int b){
int res = 1;
while(b){
if (b & 1) res = res * a % MOD;
a = a * a % MOD;
b >>= 1;
}
return res;
}
main(){
//freopen("test.inp", "r", stdin);
//freopen("test.out", "w", stdout);
cin >> n;
for (int i = 1; i <= n; i++){
cin >> l[i] >> r[i];
vt.push_back(l[i]);
vt.push_back(r[i] + 1);
}
sort(vt.begin(), vt.end());
segment.push_back({0, 0});
for (int i = 1; i < vt.size(); i++){
if (vt[i] != vt[i - 1]) segment.push_back({vt[i - 1], vt[i] - 1});
}
for (int j = 0; j < segment.size(); j++) dp[0][j] = 1;
inv[0] = 1;
for (int i = 1; i < MAXN; i++) inv[i] = pw(i, MOD - 2);
for (int i = 1; i <= n; i++){
dp[i][0] = 1;
for (int j = 1; j < segment.size(); j++){
dp[i][j] = dp[i][j - 1];
auto[a, b] = segment[j];
int cnt = 0, sum = 1;
for (int k = i; k >= 1; k--){
if (l[k] <= a && b <= r[k]){
cnt++;
sum = (sum * (b - a + cnt) % MOD) * inv[cnt] % MOD;
//C(b - a + cnt, cnt)
dp[i][j] += dp[k - 1][j - 1] * sum % MOD;
dp[i][j] %= MOD;
//if (i == 3 && j == 1) cout << k << ' ' << sum << " " << dp[k - 1][j - 1] << '\n';
}
}
//cout << "Doan " << i << " la [" << l[i] << ", " << r[i] << "], ";
//cout << "Segment " << j << ": [" << a << ", " << b << "], ";
//cout << "dp[" << i << "][" << j << "]: " << dp[i][j] << '\n';
}
}
cout << (dp[n][segment.size() - 1] - 1 + MOD) % MOD;
}
Compilation message (stderr)
boat.cpp:21:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
21 | main(){
| ^~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |