Cod sursa(job #1709810)

Utilizator CNFBTeamCNFB Udristoiu Linca Dicu CNFBTeam Data 28 mai 2016 13:58:20
Problema Padure2 Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.51 kb
#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 ) ) % MOD * 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 = c; i >= 1; i -- ) {
        dp[i] = comb( (n - p[i].x) + (m - p[i].y), (n - p[i].x) );
        
        for( int j = i + 1; j <= c; 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;
}