Pagini recente » Autentificare | Cod sursa (job #1008450) | Cod sursa (job #652764) | Cod sursa (job #248728) | Cod sursa (job #1710896)
#include <cstdio>
#include <algorithm>
using namespace std;
const int Mod = 2000003;
const int N = 1005;
int n,m,c, x,y,z, pos[N], ans, i, j, fact[2*N*N], invfact[2*N*N];
pair<int,int> a[N];
int inv(int x, int y)
{
if(!y) return 1;
if(y&1) return (int)(1LL*x*inv((int)(1LL*x*x%Mod), y>>1)%Mod);
return inv((int)(1LL*x*x%Mod), y>>1);
}
void Combo()
{
int i;
fact[0] = invfact[0] = 1;
for(i=1; i<=n+m; ++i)
{
fact[i] = (int)(1LL*fact[i-1]*i%Mod);
invfact[i] = inv(fact[i], Mod-2);
}
}
int moove(int x, int y)
{
return (int)(1LL*fact[x+y]*invfact[x]%Mod*invfact[y]%Mod);
}
int main()
{
freopen("padure2.in", "r", stdin);
freopen("padure2.out", "w", stdout);
scanf("%d%d%d", &n, &m, &c);
for(i=1; i<=c; ++i)
scanf("%d%d", &a[i].first, &a[i].second);
sort(a+1, a+c+1);
Combo();
ans = moove(n-1, m-1);
for(i=1; i<=c; ++i)
{
pos[i] = moove(a[i].first-1, a[i].second-1);
for(j=1; j<i; ++j)
if(a[j].second<=a[i].second)
pos[i] -= pos[j];
if(pos[i]<0)
pos[i] = (pos[i]%Mod + Mod)%Mod;
ans -= (int)(1LL*pos[i]*moove(n-a[i].first, m-a[i].second)%Mod);
}
if(ans<0)
ans = (ans%Mod + Mod)%Mod;
printf("%d\n", ans);
return 0;
}