Pagini recente » Cod sursa (job #2013435) | Borderou de evaluare (job #103601) | Cod sursa (job #2001685) | Cod sursa (job #2104943) | Cod sursa (job #1719740)
#include <bits/stdc++.h>
using namespace std;
const int mod = 2000003;
typedef long long ll;
struct p
{
ll x,y;
};
ll h,w,n;
p a[1002];
int rez=0;
ll pp(ll x, int y)
{
if (!y) return 1;
ll t = pp(x,y/2);
t = t*t;
t%=mod;
if (y%2) t*=x;
t%=mod;
return t;
}
int memo[2000005];
void mm()
{
memo[0] = 1;
for (int i=1; i<=2000001; i++)
memo[i] = (1ll*memo[i-1]*i)%mod;
}
ll ways(p x, p y)
{
if (x.x+x.y>y.x+y.y) return 0;
if (y.x<x.x || y.y<x.y) return 0;
ll w=memo[y.x+y.y-(x.x+x.y)];
ll ww=memo[y.x-x.x]*memo[y.y-x.y];
ww%=mod;
ww = pp(ww,mod-2);
w = w*ww;
w%=mod;
return w;
}
int dp[1002][1002];
p st,en;
int d[1002];
void bfs()
{
for (int i=0; i<=n; i++)
d[i]=0;
d[0]=1;
for (int i=0; i<=n; i++)
for (int j=i+1; j<=n; j++)
d[j]-=(1ll*d[i]*dp[i][j])%mod,d[j]%=mod;
for (int i=0; i<=n; i++)
rez+=(1ll*d[i]*dp[i][n+1])%mod,rez%=mod;
}
int main()
{
ifstream cin("padure2.in");
ofstream cout("padure2.out");
cin>>h>>w>>n;
mm();
st.x=st.y=1;
en.x=h,en.y=w;
for (int i=1; i<=n; i++)
cin>>a[i].x>>a[i].y;
for (int i=0; i<=n+1; i++)
for (int j=0; j<=n+1; j++)
dp[i][j]=0;
sort(a+1,a+n+1,[](p x, p y){return (x.x+x.y<y.x+y.y);});
dp[0][n+1] = ways(st,en);
for (int i=1; i<=n; i++)
dp[0][i] = ways(st,a[i])%mod;
for (int i=1; i<=n; i++)
dp[i][n+1] = ways(a[i],en)%mod;
for (int i=1; i<=n; i++)
for (int j=i+1; j<=n; j++)
dp[i][j]=ways(a[i],a[j])%mod;
rez=0;
bfs();
rez+=mod;
rez%=mod;
cout<<rez;
return 0;
}