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>
#define ll long long
#define MOD (ll)(1e9 + 7)
using namespace std;
ll lo[1020], hi[1020];
ll A[510], B[510], baser[510];
ll dp[510][1020];
ll cnt, tot, N;
void add_mod(ll& ret, ll params)
{
ret += params;
ret %= MOD;
}
void mul_mod(ll& ret, ll params)
{
ret *= params;
ret %= MOD;
}
void sub_mod(ll& ret, ll params)
{
ret = (ret - params + MOD) % MOD;
}
void precomp()
{
baser[1] = 1;
for (ll i = 2; i <= N; i++)
{
baser[i] = MOD - (MOD / i);
mul_mod(baser[i], baser[MOD % i]);
}
stable_sort(hi + 1, hi + cnt + 1);
cnt = unique(hi + 1, hi + cnt + 1) - hi;
for (ll i = 1; i <= N; i++)
{
A[i] = lower_bound(hi + 1, hi + cnt, A[i]) - hi;
B[i] = lower_bound(hi + 1, hi + cnt, B[i]) - hi;
}
cnt -= 2;
for (ll i = 1; i <= cnt; i++)
{
lo[i] = hi[i + 1];
sub_mod(lo[i], hi[i]);
}
}
void solve()
{
for (ll i = 0; i <= cnt; i++)
dp[0][i] = 1;
for (ll i = 1; i <= N; i++)
{
for (ll j = A[i], t = B[i]; j < t; j++)
{
ll C = lo[j], r = lo[j], inn = 1;
for (ll k = i - 1; k >= 0; k--)
{
ll tmp = dp[k][j - 1];
mul_mod(tmp, C);
add_mod(dp[i][j], tmp);
if (A[k] > j || j >= B[k])
continue;
r++, inn++;
tmp = C;
mul_mod(tmp, r);
mul_mod(tmp, baser[inn]);
C = tmp;
}
}
for (ll j = 2; j <= cnt; j++)
add_mod(dp[i][j], dp[i][j - 1]);
}
for (ll i = 1; i <= N; i++)
add_mod(tot, dp[i][cnt]);
}
int main()
{
cin >> N;
for (ll i = 1; i <= N; i++)
{
cin >> A[i] >> B[i];
hi[++cnt] = A[i];
hi[++cnt] = ++B[i];
}
precomp();
solve();
cout << tot;
}
# | 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... |