Pagini recente » Cod sursa (job #1517625) | Cod sursa (job #3156938) | Cod sursa (job #2490628) | Cod sursa (job #888542) | Cod sursa (job #1711282)
#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];
void euclid(int a, int b)
{
if(!b)
{
x=1;
y=0;
return;
}
euclid(b,a%b);
int x0=x;
x=y;
y=x0-a/b*y;
}
int inv(int a)
{
euclid(a,Mod);
if(x<0) x=(x%Mod+Mod);
if(x==Mod) return 0;
return x;
}
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] = (int)(1LL*invfact[i-1]*inv(i)%Mod);
}
}
int moove(int x, int y)
{
return (int)(1LL*fact[x+y]*invfact[x]*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] -= (int)(1LL*pos[j]*moove(a[i].first-a[j].first, a[i].second-a[j].second)%Mod);
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;
}