Pagini recente » Cod sursa (job #1828087) | Statistici Robert Ciobanu (asasinulmortii) | Cod sursa (job #1846044) | Cod sursa (job #12271) | Cod sursa (job #2738170)
#include <bits/stdc++.h>
using namespace std;
#define cin fin
#define cout fout
ifstream cin("padure2.in");
ofstream cout("padure2.out");
#define MOD 2000003
struct Math{
int N;
vector<int> fact;
vector<int> inv;
int binpow(int b, int e){
int sol=1;
while(e){
if(e&1) sol=(1ll*sol*b)%MOD;
b=(1ll*b*b)%MOD;
e>>=1;
}
return sol;
}
Math(int N): N(N+1){
fact.resize(N+1);
inv.resize(N+1);
fact[0]=1;
for(int i=1;i<=N;++i) fact[i]=(1LL*fact[i-1])*i%MOD;
inv[N]=binpow(fact[N], MOD-2);
for(int i=N-1;i;i--) inv[i]=(1ll*inv[i+1]*(i+1))%MOD;
}
int comb(int n, int k){
if(n==0||k==0||n==k) return 1;
return 1LL*(1LL*fact[n]*inv[k]%MOD)*inv[n-k]%MOD;
}
};
int dp[1002];
vector<pair<int, int>> c;
int main(){
int n, m;
int nrc;
cin>>n>>m>>nrc;
nrc++;
Math math(n+m);
c.resize(nrc+1);
for(int i=1;i<nrc;++i){
cin>>c[i].first>>c[i].second;
}
c[nrc]=make_pair(n, m);
sort(c.begin()+1, c.end());
for(int i=1;i<=nrc;++i){
dp[i]=math.comb(c[i].first-1+c[i].second-1, c[i].first-1);
for(int j=1;j<i;++j){
if((c[j].first>c[i].first)||(c[j].second>c[i].second)) continue;
dp[i]=(dp[i]+MOD-((1LL*dp[j]*math.comb(c[i].first-c[j].first+c[i].second-c[j].second, c[i].first-c[j].first)%MOD)))%MOD;
}
}
cout<<dp[nrc]<<"\n";
}