Cod sursa(job #2739123)

Utilizator cristi_macoveiMacovei Cristian cristi_macovei Data 6 aprilie 2021 21:22:28
Problema Padure2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 1.57 kb
#include <bits/stdc++.h>

using namespace std;

const int CMAX = 1e3;
const int NMAX = 1e6;
const int MOD = 2e6 + 3;

class Point {
public:
  int x, y;

  Point() = default;

  Point(int x, int y):
    x(x), y(y) {};

  bool operator < (const Point& other) const {
    if (this->x != other.x)
      return this->x < other.x;

    return this->y < other.y;
  }
};

int c;
Point points[1 + CMAX + 1];
int64_t dp[1 + CMAX + 1];

int64_t fact[1 + 2 * NMAX];

int64_t log_pow(int base, int exp) {
  int64_t ans = 1;
  int64_t temp = base;

  while (exp) {
    if (exp & 1)
      ans = (ans * temp) % MOD;

    exp >>= 1;
    temp = (temp * temp) % MOD;
  }

  return ans;
}

void factorial() {
  fact[0] = 1;

  for (int i = 1; i <= 2 * NMAX; ++i)
    fact[i] = (fact[i - 1] * i) % MOD;
}

inline int64_t inv(int64_t base) {
  return log_pow(base, MOD - 2);
}

inline int64_t comb(int n, int k) {
  int64_t prod = (fact[k] * fact[n - k]) % MOD;

  return (fact[n] * inv(prod)) % MOD;
}

int main() {
  std::ifstream in("padure2.in");
  std::ofstream out("padure2.out");

  factorial();

  int n, m;
  in >> n >> m >> c;

  for (int i = 1; i <= c; ++i)
    in >> points[i].x >> points[i].y;
  points[++c] = Point(n, m);

  std::sort(points + 1, points + 1 + c);

  for (int i = 1; i <= c; ++i) {
    dp[i] = comb(points[i].x + points[i].y - 2, points[i].x - 1);

    for (int j = 1; j < i; ++j) {
      if (points[j].y <= points[i].y)
        dp[i] = (dp[i] - dp[j] * comb(points[i].x - points[j].x + points[i].y - points[j].y, points[i].x - points[j].x) % MOD + MOD) % MOD;
    }
  }

  out << dp[c];

  return 0;
}