Pagini recente » Cod sursa (job #3244098) | Cod sursa (job #3176746) | Cod sursa (job #1900283) | Cod sursa (job #1763987) | Cod sursa (job #1713066)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("padure2.in");
ofstream fout("padure2.out");
long long n,c,i,j,m,x,y,nr;
long long fact[2000001];
long long dp[1002];
struct ciuperci{
long long x,y;
}v[1001];
bool cmp(ciuperci a, ciuperci b)
{
if(a.x<b.x) return 1;
else if(a.x==b.x) return a.y<b.y;
else return 0;
}
long long put(long long n, long long p)
{
long long rez=1;
while(p>0)
{
if(p%2==0)
{
n=(n*n)%2000003;
p/=2;
}
else
{
rez=(rez*n)%2000003;
p--;
}
}
return rez%2000003;
}
long long combinari(long long n, long long k)
{
long long rez=put(fact[k], 2000001);
rez=rez*put(fact[n-k],2000001);
rez%=2000003;
rez*=fact[n];
rez%=2000003;
return rez;
}
int main()
{
fin>>n>>m;
fin>>c;
for(i=1;i<=c;++i)
fin>>v[i].x>>v[i].y;
sort(v+1,v+c+1,cmp);
fact[0]=1;
for(i=1;i<=2000000;++i)
fact[i]=(fact[i-1]*i)%2000003;
if(v[c].x==n && v[c].y==m) {fout<<"0"; return 0; }
c++; v[c].x=n; v[c].y=m;
for(i=1;i<=c;++i)
{
nr=combinari(v[i].x+v[i].y-2,v[i].y-1);
for(j=1;j<i;++j)
{
if(v[j].y<=v[i].y)
{
nr-=(dp[j]*combinari(v[i].x-v[j].x+v[i].y-v[j].y,v[i].y-v[j].y))%2000003;
if(nr<0) nr+=2000003;
}
}
dp[i]=nr;
}
fout<<dp[c];
return 0;
}