Pagini recente » Cod sursa (job #3222261) | Cod sursa (job #1952298) | Cod sursa (job #2932885) | Cod sursa (job #1762066) | Cod sursa (job #1858259)
#include <cstdio>
#include <algorithm>
#define VMax 2000000
#define NMax 1000
#define x first
#define y second
using namespace std;
const int MOD = 2000003;
typedef pair<int, int> per;
per v[NMax+1];
int nr[NMax+1];
int f[VMax+1];
void Precalc()
{
f[0] = 1;
for(int i = 1; i <= VMax; ++i) f[i] = (1LL * f[i-1] * i) % MOD;
}
int LgPut(int X, int B)
{
int A=1;
while(B)
{
if(B%2) A=(1LL*A*X)%MOD;
X=(1LL*X*X)%MOD;
B/=2;
}
return A;
}
int Comb(int n, int k)
{
int inv1 = LgPut(f[k],MOD-2);
int inv2 = LgPut(f[n-k],MOD-2);
return ( 1LL * ( (1LL * f[n] * inv1) % MOD ) * inv2 ) % MOD;
}
int Get_Comb(int x, int y)
{
int a,b;
a = (x+y)-2;
b = y-1;
return Comb(a,b);
}
int main(){
FILE* fin = fopen("padure2.in","r");
FILE* fout = fopen("padure2.out","w");
int i,j,N,M,C,res;
Precalc();
fscanf(fin,"%d %d %d",&N,&M,&C);
for(i = 1; i <= C; ++i) fscanf(fin,"%d %d",&v[i].x,&v[i].y);
sort(v+1,v+C+1);
res = Get_Comb(N,M);
for(i = 1; i <= C; ++i) nr[i] = Get_Comb(v[i].x, v[i].y);
for(i = 1; i <= C; ++i)
{
res = (res - 1LL * nr[i] * Get_Comb(N-v[i].x+1, M-v[i].y+1)) % MOD + MOD;
for(j = i+1; j <= C; ++j)
if(v[j].y >= v[i].y)
nr[j] = (nr[j] - 1LL * nr[i] * Get_Comb(v[j].x-v[i].x+1, v[j].y-v[i].y+1)) % MOD + MOD;
}
fprintf(fout,"%d",res%MOD);
return 0;
}