Submission #249908

#TimeUsernameProblemLanguageResultExecution timeMemory
249908receedBoat (APIO16_boat)C++14
100 / 100
600 ms30972 KiB
#include <iostream> #include <iomanip> #include <cstdio> #include <vector> #include <algorithm> #include <cmath> #include <cstring> #include <cassert> #include <string> #include <set> #include <map> #include <random> #include <bitset> #include <string> #include <unordered_set> #include <unordered_map> #include <deque> #include <queue> #define rep(i, n) for (int i = 0; i < (n); i++) #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() using namespace std; using ll = long long; using ul = unsigned long long; using ld = long double; const int N = 1001; const ll MOD = 1e9 + 7, M2 = MOD * MOD; ll a[N], b[N], ps[N][N], c[N][N], cd[N][N], rev[N], cs[N][N], dp[N][N]; ll pw(ll x, ll k) { ll r = 1; while (k) { if (k & 1) r = r * x % MOD; k >>= 1; x = x * x % MOD; } return r; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); ll n, d; cin >> n; vector<ll> li; rep(i, n) { cin >> a[i] >> b[i]; b[i]++; li.push_back(a[i]); li.push_back(b[i]); } sort(all(li)); li.resize(unique(all(li)) - li.begin()); int m = li.size(); rep(i, n) { a[i] = lower_bound(all(li), a[i]) - li.begin(); b[i] = lower_bound(all(li), b[i]) - li.begin(); rep(j, m) ps[j][i + 1] = ps[j][i] + (a[i] <= j && j < b[i]); } rep(i, n + 1) { c[i][0] = 1; for (int j = 1; j <= i; j++) c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % MOD; rev[i] = pw(i, MOD - 2); } rep(i, m - 1) { d = li[i + 1] - li[i]; cd[i][1] = d; for (int j = 1; j < n; j++) cd[i][j + 1] = cd[i][j] * (d - j) % MOD * rev[j + 1] % MOD; for (int j = 1; j <= n; j++) { for (int k = 1; k <= j; k++) { cs[i][j] += c[j - 1][k - 1] * cd[i][k]; if (cs[i][j] >= M2) cs[i][j] -= M2; } cs[i][j] %= MOD; } } rep(i, n) { for (int j = a[i]; j < b[i]; j++) { dp[i + 1][j] = cs[j][ps[j][i + 1]]; if (j) rep(k, i + 1) { dp[i + 1][j] += dp[k][j - 1] * cs[j][ps[j][i + 1] - ps[j][k]]; if (dp[i + 1][j] >= M2) dp[i + 1][j] -= M2; } dp[i + 1][j] %= MOD; } rep(j, m) dp[i + 1][j + 1] = (dp[i + 1][j] + dp[i + 1][j + 1]) % MOD; } ll ans = 0; rep(i, n + 1) { ans = (ans + dp[i][m]) % MOD; } cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...