Pagini recente » Cod sursa (job #1213899) | Cod sursa (job #1586216) | Cod sursa (job #192147) | Cod sursa (job #2608488) | Cod sursa (job #1710442)
#include<cstdio>
#include<algorithm>
#define MOD 2000003
#define MAXN 1000
#define MAXM 1000000
using namespace std;
struct mycreation{
int x, y;
};
mycreation a[MAXN+1];
int fact[2*MAXM+1],invFact[2*MAXM+1],d[MAXN+1];
bool cmp(const mycreation a,const mycreation b){
if(a.x==b.x)
return a.y<b.y;
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(){
freopen("padure2.in","r",stdin);
freopen("padure2.out","w",stdout);
int n,m,c,i,j;
scanf("%d%d%d",&n,&m,&c);
fact[0]=1;
for(i=1;i<=n+m;i++)
fact[i]=(fact[i-1]*(long long)i)%MOD;
invFact[n+m]=lgput(fact[n+m],MOD-2);
for(i=n+m-1;i>=0;i--)
invFact[i]=(invFact[i+1]*(long long)(i+1))%MOD;
for(i=1;i<=c;i++)
scanf("%d%d",&a[i].x,&a[i].y);
a[0].x=1;
a[0].y=1;
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;
}
printf("%d\n",d[0]);
return 0;
}