Cod sursa(job #2738394)

Utilizator rares404AlShaytan - Balasescu Rares rares404 Data 5 aprilie 2021 19:41:20
Problema Padure2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 1.3 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int mod = 2000003;

struct punct {
    int x, y;
};

punct v[1010];
int d[1010], fact[2000010];

int cmp(punct a, punct b) {
  if (a.x == b.x) return a.y < b.y;
  else return a.x < b.x;
}

int rid_put(int a, int b) {
  int sol = 1;
  for (int i = 1; i <= b; i <<= 1) {
    if (b & i) sol = (1LL * sol * a) % mod;
    a = (1LL * a * a) % mod;
  }
  return sol;
}

int main() {
  freopen("padure2.in", "r", stdin);
  freopen("padure2.out", "w", stdout);
  int n, m, c, a, b, c1;
  scanf("%d%d%d", &n, &m, &c);
  for (int i = 1; i <= c; i++)
    scanf("%d%d", &v[i].x, &v[i].y);
  c++;
  fact[0] = 1;
  for (int i = 1; i <= n + m; i++)
    fact[i] = (1LL * fact[i - 1] * i) % mod;
  v[c] = {n, m};
  sort(v + 1, v + c + 1, cmp);
  for (int i = 1; i <= c; i++) {
    a = v[i].x + v[i].y - 2;
    b = v[i].x - 1;
    d[i] = (1LL * fact[a] * rid_put((1LL * fact[b] * fact[a - b]) % mod, mod - 2)) % mod;
    for (int j = 1; j < i; j++)
      if (v[j].x <= v[i].x && v[j].y <= v[i].y) {
        a = (v[i].x - v[j].x) + (v[i].y - v[j].y);
        b = v[i].x - v[j].x;
        c1 = (1LL * fact[a] * rid_put((1LL * fact[b] * fact[a - b]) % mod, mod - 2)) % mod;
        d[i] = (d[i] - (1LL * d[j] * c1) % mod + mod) % mod;
      }
  }
  printf("%d", d[c]);
  return 0;
}