#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf 5e18
#define nl '\n'
const int mod = 1e9+7;
int exp(int a, int b = mod-2){
int p = 1;
while(b > 0){
if(b % 2) p = p * a % mod;
a = a * a % mod;
b /= 2;
}
return p;
}
inline void solve(){
int n;
cin>>n;
vector<pair<int,int>> ab(n+1), lr;
vector<int> v;
for(int i=1; i<=n; i++){
int a, b;
cin>>a>>b;
ab[i] = {a, b};
v.push_back(a);
v.push_back(b);
}
sort(v.begin(), v.end());
lr.push_back({0, 0});
for(int i=0; i < 2*n-1; i++){
if(v[i] != v[i+1]) lr.push_back({v[i], v[i+1]-1});
}
lr.push_back({v[2*n-1], v[2*n-1]});
int m = lr.size()-1;
int dp[n+1][m+1], dp2[n+1][m+1];
for(int i=0; i<=m; i++) dp[0][i] = 1, dp2[0][i] = 0;
int ncr[m+1][n+1];
for(int i=1; i<=m; i++){
auto [l, r] = lr[i];
int len = r-l+1;
int p = 1, f = 1;
for(int j=len, r=1; r <= min(len, n); j--, r++){
f = f * r % mod;
p = p * j % mod;
ncr[i][r] = p * exp(f) % mod;
}
}
for(int i=1; i<=n; i++){
auto [a, b] = ab[i];
dp[i][0] = 1;
for(int j=1; j<=m; j++){
auto [l, r] = lr[j];
dp[i][j] = dp2[i-1][j] + dp[i][j-1];
dp2[i][j] = 0;
for(int k=i; k>0; k--){
auto [a, b] = ab[k];
if(i-k+1 > r-l+1 or l < a or r > b) break;
dp2[i][j] += dp[k-1][j-1] * ncr[j][i-k+1];
dp2[i][j] %= mod;
}
dp[i][j] += dp2[i][j];
}
}
cout<<dp[n][m]-1;
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(NULL);cout.tie(NULL);
int t = 1;
//cin>>t;
while(t--) solve();
return 0;
}
# | 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... |