Pagini recente » Cod sursa (job #8389) | Cod sursa (job #1348220) | Cod sursa (job #846419) | Cod sursa (job #1956276) | Cod sursa (job #1709910)
#include <iostream>
#include <fstream>
using namespace std;
#define Cmax 1001
#define Nmax 1000010
#define MOD 2000003
struct {int l, c;} v[Cmax];
int nr1[Nmax], nr2[Nmax];
int fact[Nmax];
int C(int, int);
int inv_mod(int);
int power(int, int);
int main()
{
freopen("padure2.in", "r", stdin);
freopen("padure2.out", "w", stdout);
int i, j, n, m, k, res, aux;
for(fact[0] = 1, i = 1; i < Nmax; ++i)
fact[i] = (1LL * fact[i - 1] * i) % MOD;
scanf("%d %d",&n,&m);
scanf("%d",&k);
for (int i=1;i<=k;i++){
scanf("%d %d",&v[i].l,&v[i].c);
}
for(i = 1; i <= k; ++i)
if((v[i].l == 1 && v[i].c == 1) || (v[i].l == n && v[i].c == m))
{
cout << 0 << '\n';
return 0;
}
for(i = 1; i <= k; ++i)
{
nr1[i] = C(v[i].l + v[i].c - 2, v[i].l - 1);
nr2[i] = C(m - v[i].l + n - v[i].c, m - v[i].l);
}
for(res = C(m + n - 2, m - 1), i = 1; i <= k; ++i)
{
for(aux = nr2[i], j = 1; j <= k; ++j)
if(v[j].l >= v[i].l && v[j].c >= v[i].c && j != i)
{
aux -= (1LL * nr2[j] * C(v[j].l - v[i].l + v[j].c - v[i].c, v[j].l - v[i].l)) % MOD;
if(aux < 0) aux += MOD;
}
res -= (1LL * nr1[i] * aux) % MOD;
if(res < 0) res += MOD;
}
cout << res << '\n';
return 0;
}
int C(int a, int b)
{
int res = fact[a];
res = (1LL * res * inv_mod(fact[b])) % MOD;
res = (1LL * res * inv_mod(fact[a - b])) % MOD;
return res;
}
int inv_mod(int x)
{
return power(x, MOD - 2);
}
int power(int base, int exp)
{
int res;
for(res = 1; exp; exp >>= 1)
{
if(exp & 1) res = (1LL * res * base) % MOD;
base = (1LL * base * base) % MOD;
}
return res;
}