# | Submission time | Handle | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
124988 | 2019-07-04T09:46:25 Z | Mamnoon_Siam | Boat (APIO16_boat) | C++17 | 13 ms | 14328 KB |
#include <bits/stdc++.h> using namespace std; using ll = long long; const int mod = 1e9 + 7; ll qpow(ll b, ll p) { ll ret = 1; while(p) { if(p & 1) ret = (ret * b) % mod; b = (b * b) % mod, p >>= 1; } return ret; } struct base { ll x; void fix() { if(x < 0 or x >= mod) x %= mod; if(x < 0) x += mod; } base() {x = 0;} base(int _x) { x = _x; fix(); } base(ll _x) { x = _x; fix(); } base operator + (const base &o) const { base ret; ret.x = x + o.x; if(ret.x >= mod) { ret.x -= mod; } return ret; } base operator * (const base &o) const { return base(x * o.x); } base operator / (const base &o) const { return base(x * qpow(o.x, mod - 2)); } friend ostream& operator << (ostream &out, const base &o) { return out << o.x; } void operator += (const base &o) { (*this) = (*this) + o; } void operator *= (const base &o) { (*this) = (*this) * o; } }; const int maxn = 505; int n; int a[maxn], b[maxn]; int N_rng; int l[maxn << 1], r[maxn << 1]; base inv[maxn]; base dp[maxn << 1][maxn]; /* dp[rng][i] = # of ways to distribute [1..i] among [1..rng] * ranges s.t. i-th school sends positive amount of boats. */ base BC[maxn << 1][maxn]; /* BC = nCr for big N = range size, [range][r] */ base SC[maxn][maxn]; /* SC = nCr for small N, all pair (N, R) */ base g[maxn << 1][maxn]; /* g[range][k] = \sum{i = 1}^{k} \binom{k - 1}{i - 1} * \binom{range_size}{i} */ int main(int argc, char const *argv[]) { freopen("in", "r", stdin); cin >> n; vector<int> tmp; for(int i = 1; i <= n; i++) { cin >> a[i] >> b[i]; a[i]--; tmp.emplace_back(a[i]); tmp.emplace_back(b[i]); } sort(tmp.begin(), tmp.end()); tmp.erase(unique(tmp.begin(), tmp.end()), tmp.end()); for(int i = 1; i < tmp.size(); i++) { N_rng++; l[N_rng] = tmp[i - 1]; r[N_rng] = tmp[i]; } { // precalc i^{-1} inv[0] = 1; for(int i = 1; i <= n; i++) { inv[i] = base(1) / i; } } { // precalc SC[][] for(int i = 0; i <= n; i++) { SC[i][0] = 1; } for(int i = 1; i <= n; i++) { for(int j = 1; j <= i; j++) { SC[i][j] = SC[i - 1][j] + SC[i - 1][j - 1]; } } } { // precalc BC[][] for(int i = 1; i <= N_rng; i++) { BC[i][0] = 1; for(int j = 1, sz = r[i] - l[i]; j <= n and sz; j++, sz--) { BC[i][j] = BC[i][j - 1] * inv[j] * sz; } } } { // precalc g[][] for(int range = 1; range <= N_rng; range++) { for(int k = 1; k <= n; k++) { for(int i = 1; i <= k; i++) { g[range][k] += SC[k - 1][i - 1] * BC[range][i]; } } } } for(int i = 0; i <= N_rng; i++) { dp[i][0] = 1; } for(int rng = 1; rng <= N_rng; rng++) { for(int i = 1; i <= n; i++) { dp[rng][i] = dp[rng - 1][i]; if(a[i] <= l[rng] and r[rng] <= b[i]) { int cnt = 0; for(int k = i; k >= 1; k--) { if(a[k] <= l[rng] and r[rng] <= b[k]) { cnt++; } dp[rng][i] += dp[rng - 1][k - 1] * g[rng][cnt]; } } } } base ans = 0; for(int i = 1; i <= n; i++) { ans += dp[N_rng][i]; } cout << ans << endl; return 0; }
Compilation message
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
1 | Incorrect | 13 ms | 14328 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
1 | Incorrect | 13 ms | 14328 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
1 | Incorrect | 13 ms | 14328 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
1 | Incorrect | 13 ms | 14328 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |