Cod sursa(job #1719733)

Utilizator mikeshadowIon Complot mikeshadow Data 20 iunie 2016 10:11:48
Problema Padure2 Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.57 kb
#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[2001];

ll 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;
}

ll memo[2000005];

void mm()
{
	memo[0] = 1;
	for (int i=1; i<=2000001; i++)
		memo[i] = (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;
}

ll dp[2002][2002];

p st,en;

ll d[2002];

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]-=(ll)(d[i]*dp[i][j])%mod,d[j]%=mod;

	for (int i=0; i<=n; i++)
		rez+=(ll)(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]);

	for (int i=1; i<=n; i++)
		dp[i][n+1] = ways(a[i],en);

	for (int i=1; i<=n; i++)
		for (int j=i+1; j<=n; j++)
			dp[i][j]=ways(a[i],a[j]);

	rez=0;

	bfs();

	rez+=mod;
	rez%=mod;

	cout<<rez;

    return 0;
}