제출 #833041

#제출 시각아이디문제언어결과실행 시간메모리
833041errayBoat (APIO16_boat)C++17
100 / 100
707 ms4432 KiB
#include <bits/stdc++.h>

using namespace std;

#ifdef DEBUG 
  #include "/home/eagle/ioi22/d2/debug.h"
#else 
  #define debug(...) void(37)
#endif

constexpr int md = int(1e9) + 7;
int add(int x, int y) {
  if ((x += y) > md) {
    x -= md;
  }
  return x;
}
int mul(int x, int y) {
  return 1LL * x * y % md;
}
int power(int x, int p) {
  int res = 1;
  while (p > 0) {
    if (p & 1) {
      res = mul(res, x);
    }
    x = mul(x, x);
    p >>= 1;
  }
  return res;
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int N;
  cin >> N;
  vector<int> A(N), B(N);
  for (int i = 0; i < N; ++i) {
    cin >> A[i] >> B[i];
    ++B[i];
  }
  vector<int> inv(N + 1);
  for (int i = 1; i <= N; ++i) {
    inv[i] = power(i, md - 2);
  }
  debug(inv);
  vector<int> ranges(2 * N);
  for (int i = 0; i < N; ++i) {
    ranges[2 * i] = A[i];
    ranges[2 * i + 1] = B[i];
  }
  sort(ranges.begin(), ranges.end());
  ranges.erase(unique(ranges.begin(), ranges.end()), ranges.end());
  const int S = int(ranges.size());
  vector<vector<int>> binom(S - 1, vector<int>(N + 1));
  for (int i = 0; i < S - 1; ++i) {
    int diff = ranges[i + 1] - ranges[i];
    binom[i][0] = 1;
    for (int j = 1; j <= min(N, diff); ++j) {
      binom[i][j] = mul(mul(binom[i][j - 1],  (diff - j + 1)), inv[j]);
    }
  }
  vector<vector<int>> dp(S, vector<int>(N + 1));
  for (int i = 0; i < S; ++i) {
    dp[i][0] = 1;
  }
  for (int i = 0; i < N; ++i) {
    int nw = 1;
    for (int j = 0; j < S - 1; ++j) {
      int a = 0;
      bool in_range = (A[i] <= ranges[j] && ranges[j + 1] <= B[i]);
      for (int k = N - 1; k > 0; --k) {
        if (k != 0) {
          a = add(a, mul(dp[j][k], binom[j][k]));
        } 
        if (in_range) {
          dp[j][k + 1] = add(dp[j][k + 1], dp[j][k]);
        }
      }
      if (in_range) {
        dp[j][1] = add(dp[j][1], nw);
      }
      nw = add(nw, a);
    }
  }
  int ans = 0;
  for (int i = 0; i < S - 1; ++i) {
    for (int j = 1; j <= N; ++j) {
      ans = add(ans, mul(dp[i][j], binom[i][j]));
    }
  }
  cout << ans << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...