Cod sursa(job #1709661)

Utilizator PlayHPPet Rescue PlayHP Data 28 mai 2016 13:17:38
Problema Padure2 Scor 0
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.55 kb
#include <cstdio>
#include <algorithm>
#define MOD 2000003
#define MAXN 1000
#define MAXM 1000000
struct mycreation{
    int x, y;
}a[MAXN+1];
int fact[2*MAXM+1], invFact[2*MAXM+1], d[MAXN+1];
bool cmp(const mycreation a, const mycreation b){
    if(a.x==b.x) return a.y<b.y;
    else return a.x<b.x;
}
inline int lgput(int a, int n){
    int r=1;
    while(n>0){
        if(n%2){
            r=(r*(long long)a)%MOD;
        }
        n/=2;
        a=(a*(long long)a)%MOD;
    }
    return r;
}
inline int comb(int n, int k){
    return (((fact[n]*(long long)invFact[n-k])%MOD)*(long long)invFact[k])%MOD;
}
int main(){
    int n, m, c, i, j;
    FILE *fin, *fout;
    fin=fopen("padure2.in", "r");
    fout=fopen("padure2.out", "w");
    fscanf(fin, "%d%d%d", &n, &m, &c);
    fact[0]=1;
    for(i=1; i<=2*n; i++){
        fact[i]=(fact[i-1]*(long long)i)%MOD;
    }
    invFact[2*n]=lgput(fact[2*n], MOD-2);
    for(i=2*n-1; i>=0; i--){
        invFact[i]=(invFact[i+1]*(long long)(i+1))%MOD;
    }
    for(i=1; i<=c; i++){
        fscanf(fin, "%d%d", &a[i].x, &a[i].y);
    }
    a[0].x=1;
    a[0].y=1;
    std::sort(a, a+c+1, cmp);
    for(i=c; i>=0; i--){
        d[i]=comb(n-a[i].x+m-a[i].y, n-a[i].x);
        for(j=i+1; j<=c; j++){
            if((a[i].x<=a[j].x)&&(a[i].y<=a[j].y)){
                d[i]=(d[i]-comb(a[j].x-a[i].x+a[j].y-a[i].y, a[j].x-a[i].x)*(long long)d[j]+MOD*(long long)MOD)%MOD;
            }
        }
    }
    fprintf(fout, "%d\n", d[0]);
    fclose(fin);
    fclose(fout);
    return 0;
}