Pagini recente » Cod sursa (job #886057) | Cod sursa (job #651663) | Istoria paginii runda/infinity | Cod sursa (job #2095772) | Cod sursa (job #1712040)
#include <cstdio>
#include <algorithm>
#define MAXC 1000
#define MOD 2000003LL
#define MAXN 1000000
using namespace std;
long long fact[2*MAXN+1];
struct Ciuperca{
int lin,col;
};
Ciuperca C[MAXC+1];
long long dp[MAXC+1];
inline long long put(long long a){
int b=MOD-2;
long long rez=1;
while(b>0){
if(b&1)
rez=(rez*a)%MOD;
b>>=1;
a=(a*a)%MOD;
}
return rez;
}
inline long long solve(int lin,int col){
lin--;
col--;
return (fact[lin+col]*put((fact[lin]*fact[col])%MOD))%MOD;
}
bool cmp(Ciuperca a,Ciuperca b){
if(a.lin==b.lin)
return a.col<b.col;
return a.lin<b.lin;
}
int main(){
FILE*fi,*fout;
int n,m,c,i,j;
long long rez;
fi=fopen("padure2.in" ,"r");
fout=fopen("padure2.out" ,"w");
fscanf(fi,"%d%d%d" ,&n,&m,&c);
fact[0]=1;
for(i=1;i<=n+m;i++)
fact[i]=(fact[i-1]*i)%MOD;
for(i=1;i<=c;i++)
fscanf(fi,"%d%d" ,&C[i].lin,&C[i].col);
sort(C+1,C+c+1,cmp);
dp[1]=solve(C[1].lin,C[1].col);
for(i=2;i<=c;i++){
dp[i]=solve(C[i].lin,C[i].col);
for(j=i-1;j>0;j--){
dp[i]-=dp[j];
dp[i]=(dp[i]+MOD)%MOD;
}
}
rez=solve(n,m);
for(i=1;i<=c;i++){
rez-=(dp[i]*solve(n-C[i].lin+1,m-C[i].col+1))%MOD;
rez=(rez+MOD)%MOD;
}
if(rez%2==1)
rez+=MOD;
fprintf(fout,"%lld" ,(rez/2)%MOD);
fclose(fi);
fclose(fout);
return 0;
}