Pagini recente » Cod sursa (job #2917855) | Cod sursa (job #332481) | Cod sursa (job #2917004) | Cod sursa (job #2490188) | Cod sursa (job #2741442)
#include<bits/stdc++.h>
using namespace std;
int n,m,c;
pair<int,int> v[1005];
const int maxD=(1e6)+5;
long long fact[maxD];
const int mod=2000003;
int dp[1005];
inline long long fastexp(int a,int b)
{
long long res=1;
while(b)
{
if(b&1)
{
res=(1LL*res*a)%mod;
b--;
}
else
{
a=(1LL*a*a)%mod;
b>>=1;
}
}
return res;
}
inline long long C(int n,int k)
{
if(!k) return 1;
long long sol=fact[n];
sol=(1LL*sol*fastexp(fact[k],mod-2))%mod;
sol=(1LL*sol*fastexp(fact[n-k],mod-2))%mod;
return sol%mod;
}
int main()
{
freopen("padure2.in","r",stdin);
freopen("padure2.out","w",stdout);
scanf("%d%d",&n,&m);
scanf("%d",&c);
int dv=0;
for(int i=1;i<=c;i++)
{
int x,y;
scanf("%d%d",&x,&y);
if(x<1 || y<1) continue;
if(x>n || y>m) continue;
v[++dv]=make_pair(x,y);
}
c=dv;
fact[0]=1;
for(int i=1;i<=1000000;i++)
fact[i]=(1LL*fact[i-1]*i)%mod;
sort(v+1,v+c+1);
v[0]=make_pair(1,1);
v[c+1]=make_pair(n,m);
dp[0]=1;
for(int i=1;i<=c+1;i++)
{
dp[i]=C(v[i].first+v[i].second-2,v[i].first-1);
for(int j=i-1;j>=1;j--)
{
if(v[j].second>v[i].second) continue;
if(v[j].first>v[i].first) continue;
int roads=C(v[i].first-v[j].first+v[i].second-v[j].second,v[i].first-v[j].first);
int fact=(1LL*roads*dp[j])%mod;
dp[i]=(dp[i]-fact+mod)%mod;
}
}
printf("%d\n",dp[c+1]);
return 0;
}