Pagini recente » Borderou de evaluare (job #2305526) | Borderou de evaluare (job #1954342) | Borderou de evaluare (job #2360697) | Borderou de evaluare (job #2216334) | Cod sursa (job #1709421)
#include <iostream>
#include<vector>
#include<fstream>
#include<utility>
#include<algorithm>
using namespace std;
typedef struct { int x, y; } celula;
long long fact[2000006];
long long mod=2000003;
long long n,m,k,i,j;
long long dp[1005];
celula c[1005];
long long putere(long long a, long long b) {
long long rez=1;
while (b>0)
if (b%2==0) { a*=a; a%=mod; b/=2; }
else { rez*=a; rez%=mod; --b; }
return rez;
}
long long comb(long long n, long long k) {
long long sus=fact[n];
sus*=putere(fact[n-k],mod-2);
sus%=mod;
sus*=putere(fact[k],mod-2);
sus%=mod;
return sus;
}
long long solve(long long i, long long j) {
return comb(i+j-2,j-1);
}
bool cmp(celula a, celula b) {
if (a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
int main() {
ifstream cin("padure2.in");
ofstream cout("padure2.out");
fact[0]=1;
for (i=1; i<=2000000; ++i) {
fact[i]=i*fact[i-1];
fact[i]%=mod;
}
//
cin>>n>>m>>k;
for (i=1; i<=k; ++i) cin>>c[i].x>>c[i].y;
sort(c+1,c+k+1,cmp);
if (c[k].x==n && c[k].y==m) {
cout<<"0";
return 0;
}
else {
++k;
c[k].x=n;
c[k].y=m;
}
//
for (i=1; i<=k; ++i) {
dp[i]=solve(c[i].x,c[i].y);
for (j=i-1; j>=1; --j)
if (c[j].y<=c[i].y) {
long long aux=dp[j]*solve(c[i].x-c[j].x+1,c[i].y-c[j].y+1);
aux%=mod;
dp[i]-=aux;
if (dp[i]<0) dp[i]+=mod;
}
}
cout<<dp[k];
return 0;
}