# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
48534 | Kmcode | Boat (APIO16_boat) | C++14 | 1430 ms | 21208 KiB |
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 MOD 1000000007
#define MAX 1102
int n;
vector<pair<int, int> > v;
vector<int> vv;
long long int dp[MAX][MAX];
long long int way[MAX][MAX];
long long int c[MAX][MAX];
long long int ppow(long long int i, long long int j) {
long long int res = 1;
while (j) {
if ((j & 1LL)) {
res *= i;
if (res >= MOD)res %= MOD;
}
i *= i;
if (i >= MOD)i %= MOD;
j >>= 1LL;
}
return res;
}
long long int k[MAX];
int main() {
k[0] = 1;
for (int i = 1; i < MAX; i++) {
k[i] = k[i - 1];
k[i] *= (long long int)(i);
if (k[i] >= MOD)k[i] %= MOD;
}
for (int i = 0; i < MAX; i++) {
k[i] = ppow(k[i], MOD - 2);
}
c[0][0] = 1;
for (int i = 0; i + 1 < MAX; i++) {
for (int j = 0; j <= i; j++) {
c[i + 1][j] += c[i][j];
c[i + 1][j + 1] += c[i][j];
if (c[i + 1][j] >= MOD)c[i + 1][j] -= MOD;
if (c[i + 1][j + 1] >= MOD)c[i + 1][j + 1] -= MOD;
}
}
cin >> n;
vv.push_back(0);
for (int i = 0; i < n; i++) {
int a, b;
scanf("%d%d", &a, &b);
vv.push_back(a), vv.push_back(b+1);
v.push_back(make_pair(a, b));
}
sort(vv.begin(), vv.end());
vv.erase(unique(vv.begin(), vv.end()), vv.end());
vv.push_back(vv.back() + 1);
dp[0][0] = 1;
for (int i = 0; i + 1 < vv.size(); i++) {
long long int rng = vv[i + 1] - vv[i];
long long int up = 1;
long long int dw = 0;
for (int j = 1; j <= 500; j++) {
if (rng < j)break;
up *= (long long int)(rng - j + 1LL);
if (up >= MOD)up %= MOD;
dw = k[j];
dw *= up;
if (dw >= MOD)dw %= MOD;
way[i][j] = dw;
}
for (int j = 500; j >= 1; j--) {
long long int tmp = 0;
for (int k = j; k >= 1; k--) {
tmp += way[i][k] * c[j - 1][k - 1];
if (tmp >= MOD)tmp %= MOD;
}
way[i][j] = tmp;
if (tmp < 0LL)while (1);
}
}
long long int AA = 0;
for (int i = 0; i < v.size(); i++) {
long long int su = 0;
for (int j = 0; j + 1 < vv.size(); j++) {
int valid = 0;
for (int k = i; k < v.size(); k++) {
if (v[k].first <= vv[j] && vv[j + 1] - 1 <= v[k].second) {
valid++;
if (su < 0LL)while(1);
dp[k + 1][j] += su*way[j][valid];
AA += su*way[j][valid];
if (AA >= MOD)AA %= MOD;
if (dp[k + 1][j] >= MOD)dp[k + 1][j] %= MOD;
}
}
su += dp[i][j];
if (su >= MOD)su %= MOD;
}
}
if (AA < 0LL)exit(1);
printf("%lld\n", AA);
return 0;
}
Compilation message (stderr)
# | 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... |