Submission #1203229

#TimeUsernameProblemLanguageResultExecution timeMemory
1203229thinknoexitBoat (APIO16_boat)C++17
100 / 100
947 ms8388 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 505;
const ll MOD = 1e9 + 7;
int a[N], b[N];
ll fac[N], inv[N];
ll sum[2 * N], qs[2 * N];
ll nCr[2 * N][N];
ll dp[2 * N][N]; // currently in i-th interval using j school
ll mop(ll a, ll p = MOD - 2) {
    ll ans = 1;
    for (;p != 0ll;p >>= 1ll, a = a * a % MOD) {
        if (p & 1ll) ans = ans * a % MOD;
    }
    return ans;
}
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int n;
    cin >> n;
    fac[0] = 1;
    for (int i = 1;i <= n;i++) {
        fac[i] = fac[i - 1] * i % MOD;
        inv[i] = mop(fac[i]);
    }
    vector<int> c;
    c.push_back(0);
    for (int i = 1;i <= n;i++) {
        cin >> a[i] >> b[i];
        c.push_back(a[i] - 1);
        c.push_back(b[i]);
    }
    sort(c.begin(), c.end());
    c.resize(unique(c.begin(), c.end()) - c.begin());
    int sz = c.size();
    for (int i = 1;i < sz;i++) {
        nCr[i][0] = 1;
        ll mul = 1;
        for (int j = 1;j <= min(c[i] - c[i - 1], n);j++) {
            mul = mul * (c[i] - c[i - 1] - j + 1) % MOD;
            nCr[i][j] = mul * inv[j] % MOD;
        }
    }
    for (int j = 0;j < sz;j++) qs[j] = 1;
    // 0 1 2 3
    // - 1 2 -
    // - - 2 3

    for (int i = 1;i <= n;i++) {
        a[i] = lower_bound(c.begin(), c.end(), a[i] - 1) - c.begin();
        b[i] = lower_bound(c.begin(), c.end(), b[i]) - c.begin();
        for (int j = a[i] + 1;j <= b[i];j++) {
            for (int k = min(c[j] - c[j - 1], n);k >= 1;k--) {
                sum[j] = (sum[j] - dp[j][k] * nCr[j][k] % MOD + MOD) % MOD;
                dp[j][k] = (dp[j][k] + dp[j][k - 1]) % MOD;
                if (k == 1) dp[j][k] = (dp[j][k] + qs[j - 1]) % MOD;
                sum[j] = (sum[j] + dp[j][k] * nCr[j][k]) % MOD;
            }
        }
        for (int j = 1;j < sz;j++) {
            qs[j] = (qs[j - 1] + sum[j]) % MOD;
        }
        // for (int j = 1;j < sz;j++) {
        //     for (int k = 1;k <= n;k++) {
        //         cout << dp[j][k] << " \n"[k == n];
        //     }
        // }
    }
    cout << (qs[sz - 1] - 1 + MOD) % MOD << '\n';
    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...