This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define TRACE(x) cerr << #x << " :: " << x << endl
#define _ << " " <<
#define SZ(x) (int)(x).size()
#define ALL(x) (x).begin(),(x).end()
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define RFOR(i,a,b) for (int i=(a);i>=(b);--i)
const int MX_N = 505;
const int MOD = 1e9+7;
int N, A[MX_N], B[MX_N];
vector<int> val;
int inv[MX_N];
int f[MX_N][2*MX_N];
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> N;
FOR(i,1,N){
cin >> A[i] >> B[i];
B[i] += 1;
val.push_back(A[i]);
val.push_back(B[i]);
}
sort(ALL(val));
val.resize(unique(ALL(val))-val.begin());
FOR(i,1,N){
A[i] = lower_bound(ALL(val),A[i])-val.begin();
B[i] = lower_bound(ALL(val),B[i])-val.begin();
}
inv[1] = 1; FOR(i,2,N) inv[i] = (long long) (MOD-MOD/i) * inv[MOD%i] % MOD;
FOR(p,0,SZ(val)-1) f[N+1][p] = 1;
FOR(i,1,N) f[i][SZ(val)] = 0;
RFOR(p,SZ(val)-2,0){
int lp = val[p+1]-val[p];
RFOR(i,N,1){
f[i][p] = 0;
if (p < SZ(val)-1) f[i][p] = (f[i][p] + f[i][p+1]) % MOD;
if (A[i] <= p && p < B[i]) {
int m = 0;
int g = lp;
FOR(j,i+1,N+1){
f[i][p] = (f[i][p] + (long long) g * f[j][p+1] % MOD) % MOD;
if (A[j] <= p && p < B[j]) {
++m;
g = (long long) g * (m + lp) % MOD * inv[m+1] % MOD;
}
}
}
//TRACE(i _ p _ f[i][p]);
}
}
int ans = 0;
FOR(i,1,N) ans = (ans + f[i][0]) % MOD;
cout << ans;
}
# | 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... |