Cod sursa(job #2260722)

Utilizator PetyAlexandru Peticaru Pety Data 15 octombrie 2018 14:55:45
Problema Padure2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 1.37 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("padure2.in");
ofstream fout("padure2.out");

const int MOD = 2000003;
int n, m, nrc;
int dp[1002], fact[2000002], inv[2000002];

struct Ciuperci {
  int x, y;
}v[1002];

bool cmp (Ciuperci x, Ciuperci y) {
  if (x.x == y.x)
    return x.y < y.y;
  else
    return x.x < y.x;
}

int lol(int a, int b) {
  int ans = 1;
  while (b) {
    if (b & 1)
      ans = 1LL * ans * a % MOD;
     a = 1LL * a * a % MOD;
     b >>= 1;
  }
  return ans;
}

void precalculare() {
  fact[0] = fact[1] = 1;
  for(int i = 2; i <= 2000000; ++i)
    fact[i] = (1LL * fact[i - 1] * i) % MOD;
  inv[2000000] = lol(fact[2000000], MOD - 2);
  for(int i = 2000000 - 1; i >= 0; --i)
    inv[i] = (1LL * inv[i + 1] * (i + 1)) % MOD;
}

int comb(int n, int k) {
  return (1LL * fact[n] * inv[k] * inv[n - k]) % MOD;
}

int main() {
  precalculare();
  fin >> n >> m >> nrc;
  for (int i = 1; i <= nrc; ++i) {
    fin >> v[i].x >> v[i].y;
  }
  sort(v + 1, v + 1 + nrc, cmp);
  v[++nrc].x = n;
  v[nrc].y = m;
  for (int i = 1; i <= nrc; ++i) {
    dp[i] = comb(v[i].x + v[i].y - 2, v[i].x -1);
    for (int j = 1; j < i; ++j)
      if(v[j].y <= v[i].y)
        dp[i] = (dp[i] - 1LL * dp[j] * comb(v[i].x - v[j].x + v[i].y - v[j].y, v[i].x - v[j].x) % MOD + MOD) % MOD;
  }
  fout << dp[nrc];
  return 0;
}