Pagini recente » Cod sursa (job #1710240) | Cod sursa (job #1556025) | Istoria paginii runda/ichbscoala2015clasa6/clasament | Istoria paginii runda/simulare_oji10_2009/clasament | Cod sursa (job #1710676)
# include <bits/stdc++.h>
using namespace std;
# define x first
# define y second
const int Xp=2000003;
int dp[1<<10];
pair <int,int> s[1<<10];
int i,j,f[1<<21];
int pw(int a,int b)
{
int ans=1;
while(b)
{
if(b&1) ans=(1LL*ans*a)%Xp;
a=(1LL*a*a)%Xp;
b>>=1;
}
return ans;
}
int C(int a,int b)
{
return (((1LL*f[b]*pw(f[a],Xp-2)%Xp)*pw(f[b-a],Xp-2)))%Xp;
}
int main(void)
{
ifstream fi("padure2.in");
ofstream fo("padure2.out");
int h,w,n;
fi>>h>>w>>n;
for(i=1;i<=n;++i) fi>>s[i].x>>s[i].y;
sort(s+1,s+n+1);
s[++n]={h,w};
f[0]=1;
const int N=2e6;
for(i=1;i<=N;++i) f[i]=1ll*i*f[i-1]%Xp;
for(i=1;i<=n;++i)
{
dp[i]=C(s[i].x-1,s[i].x+s[i].y-2);
for(j=i-1;j;--j)
if(s[j].x<=s[i].x&&s[j].y<=s[i].y)
{
int p=C(s[i].x-s[j].x,s[i].x+s[i].y-s[j].x-s[j].y);
p=1LL*p*dp[j]%Xp;
dp[i]-=p;
if(dp[i]<0) dp[i]+=Xp;
}
dp[i]%=Xp;
}
fo<<dp[n];
return 0;
}