Pagini recente » Istoria paginii runda/3uqjey4/clasament | Cod sursa (job #1505220) | Cod sursa (job #1792214) | Cod sursa (job #215570) | Cod sursa (job #1710883)
#include <cstdio>
#include <algorithm>
using namespace std;
const int Mod = 2000003;
const int N = 1005;
const int sz = 303;
int n,m,c, x,y,z, pos[N], ans, i, j, fact[2*N*N], invfact[2*N*N];
pair<int,int> a[N];
int inv(int x, int y)
{
if(!y) return 1;
if(y&1) return 1LL*x*inv(1LL*x*x%Mod, y>>1)%Mod;
return inv(1LL*x*x%Mod, y>>1);
}
void Combo()
{
int i;
fact[0] = invfact[0] = 1;
for(i=1; i<=2*n || i<=2*m; ++i)
{
fact[i] = (int)(1LL*fact[i-1]*i%Mod);
invfact[i] = inv(fact[i], Mod-2);
}
}
int moove(int x, int y)
{
return (int)(1LL*fact[x+y]*invfact[x]%Mod*invfact[y]%Mod);
}
int main()
{
freopen("padure2.in", "r", stdin);
freopen("padure2.out", "w", stdout);
scanf("%d%d%d", &n, &m, &c);
for(i=1; i<=c; ++i)
scanf("%d%d", &a[i].first, &a[i].second);
sort(a+1, a+c+1);
Combo();
for(i=1; i<=c; ++i)
{
x = moove(a[i].first-1, a[i].second-1);
y = moove(n-a[i].first, m-a[i].second);
pos[i] = (int)(1LL*x*y%Mod);
for(j=1; j<i; ++j)
if(a[j].second<=a[i].second)
{
x = moove(a[j].first-1, a[j].second-1);
y = moove(a[i].first-a[j].first, a[i].second-a[j].second);
z = moove(n-a[i].first, m-a[i].second);
pos[i] -= (int)(1LL*x*y%Mod*z%Mod);
}
if(pos[i]<0)
pos[i] = (pos[i]%Mod + Mod) % Mod;
}
ans = moove(n-1, m-1);
for(i=1; i<=c; ++i) ans -= pos[i];
if(ans<0)
ans = (ans%Mod + Mod)%Mod;
printf("%d\n", ans);
return 0;
}