Pagini recente » Cod sursa (job #620189) | Cod sursa (job #1606852) | Cod sursa (job #17897) | Cod sursa (job #3202330) | Cod sursa (job #2720482)
#include <bits/stdc++.h>
#define DIM 2000010
#define MOD 2000003
using namespace std;
int fact[DIM],inv[DIM],dp[DIM];
pair <int,int> v[DIM];
int n,m,k,i,j;
int lg_put (int a, int b){
if (!b)
return 1;
int nr = lg_put (a,b/2);
if (b%2)
return 1LL * nr * nr % MOD * a % MOD;
else return 1LL * nr * nr % MOD;
}
inline int cmp (pair<int,int> a, pair<int,int> b){
return a.first + a.second < b.first + b.second;
}
int comb (int n, int k){
return 1LL * fact[n] * inv[k] % MOD * inv[n-k] % MOD;
}
int solve (int x, int y, int x2, int y2){
return comb(x2-x + y2-y,x2-x);
}
int main (){
ifstream cin ("padure2.in");
ofstream cout ("padure2.out");
cin>>n>>m>>k;
for (i=1;i<=k;++i)
cin>>v[i].first>>v[i].second;
v[++k] = make_pair(n,m);
sort (v+1,v+k+1,cmp);
fact[0] = inv[0] = 1;
for (i=1;i<=n+m;++i)
fact[i] = 1LL * fact[i-1] * i % MOD;
inv[n+m] = lg_put (fact[n+m],MOD-2);
for (i=n+m-1;i;i--)
inv[i] = 1LL * inv[i+1] * (i+1) % MOD;
for (i=1;i<=k;++i){
dp[i] = solve (1,1,v[i].first,v[i].second);
for (j=1;j<i;++j){
if (v[j].first <= v[i].first && v[j].second <= v[i].second){
dp[i] = (dp[i] - 1LL * dp[j] * solve(v[j].first,v[j].second,v[i].first,v[i].second) % MOD) % MOD;
if (dp[i] < 0)
dp[i] += MOD;
}}}
cout<<dp[k];
return 0;
}