Pagini recente » Cod sursa (job #2212010) | Cod sursa (job #1089739) | Cod sursa (job #1457712) | Cod sursa (job #2334456) | Cod sursa (job #1709656)
#include <cstdio>
#include <algorithm>
#define MOD 2000003
#define MAXN 1000
#define MAXM 1000000
struct mycreation{
int x, y;
}a[MAXN+1];
int fact[2*MAXM+1], invFact[2*MAXM+1], d[MAXN+1];
bool cmp(const mycreation a, const mycreation b){
return a.x<b.x;
}
inline int lgput(int a, int n){
int r=1;
while(n>0){
if(n%2){
r=(r*(long long)a)%MOD;
}
n/=2;
a=(a*(long long)a)%MOD;
}
return r;
}
inline int comb(int n, int k){
return (((fact[n]*(long long)invFact[n-k])%MOD)*(long long)invFact[k])%MOD;
}
int main(){
int n, m, c, i, j;
FILE *fin, *fout;
fin=fopen("padure2.in", "r");
fout=fopen("padure2.out", "w");
fscanf(fin, "%d%d%d", &n, &m, &c);
fact[0]=1;
for(i=1; i<=2*n; i++){
fact[i]=(fact[i-1]*(long long)i)%MOD;
}
invFact[2*n]=lgput(fact[2*n], MOD-2);
for(i=2*n-1; i>=0; i--){
invFact[i]=(invFact[i+1]*(long long)(i+1))%MOD;
}
for(i=1; i<=c; i++){
fscanf(fin, "%d%d", &a[i].x, &a[i].y);
}
a[0].x=1;
a[0].y=1;
std::sort(a, a+c+1, cmp);
for(i=c; i>=0; i--){
d[i]=comb(n-a[i].x+m-a[i].y, n-a[i].x);
for(j=i+1; j<=c; j++){
if((a[i].x<=a[j].x)&&(a[i].y<=a[j].y)){
d[i]=(d[i]-comb(a[j].x-a[i].x+a[j].y-a[i].y, a[j].x-a[i].x)*(long long)d[j]+MOD*(long long)MOD)%MOD;
}
}
}
fprintf(fout, "%d\n", d[0]);
fclose(fin);
fclose(fout);
return 0;
}