Pagini recente » Cod sursa (job #1574865) | Cod sursa (job #451106) | Profil RolandPetrean | Cod sursa (job #17664) | Cod sursa (job #1709743)
#include <cstdio>
#include <algorithm>
const int SIZE = 1e3 + 5;
const int MOD = 2e6 + 3;
const int INFI = 0x3f3f3f3f;
int dp[SIZE], n, m, c; struct point{ int x, y; } p[SIZE];
int fact[SIZE * SIZE * 2];
inline int power( int a, int b ) {
if( b == 0 )
return 1;
int c = power( a, b / 2 );
c = (c * 1LL * c) % MOD;
if( b % 2 == 1 )
c = (c * 1LL * a) % MOD;
return c;
}
int comb( int n, int k ) {
return ( 1LL * fact[n] * power( fact[k], MOD - 2 ) * power( fact[n - k], MOD - 2 ) ) % MOD;
}
inline bool cmp( point a, point b ) {
if( a.x == b.x ) return a.y < b.y;
else return a.x < b.x;
}
int main( int argc, const char *argv[] ) {
freopen( "padure2.in" , "r", stdin );
freopen( "padure2.out", "w", stdout );
fact[0] = 1;
for( int i = 1; i < MOD; i ++ )
fact[i] = (fact[i - 1] * 1LL * i) % MOD;
scanf( "%d %d %d", &n, &m, &c );
for( int i = 1; i <= c; i ++ )
scanf( "%d %d", &p[i].x, &p[i].y );
p[++c] = {1, 1};
std::sort( p + 1, p + c + 1, cmp );
for( int i = n; i >= 1; i -- ) {
dp[i] = comb( (n - p[i].x) + (m - p[i].y), (n - p[i].x) );
for( int j = i + 1; j <= n; j ++ ) {
if( p[j].y < p[i].y )
continue;
dp[i] = ( dp[i] - (comb( (p[j].x - p[i].x) + (p[j].y - p[i].y), (p[j].x - p[i].x) ) * 1LL * dp[j]) % MOD + MOD ) % MOD;
}
}
printf( "%d\n", dp[1] );
return 0;
}