Cod sursa(job #1710442)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 28 mai 2016 22:45:56
Problema Padure2 Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.42 kb
#include<cstdio>
#include<algorithm>
#define MOD 2000003
#define MAXN 1000
#define MAXM 1000000
using namespace std;
struct mycreation{
    int x, y;
};
mycreation 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;
    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(){
    freopen("padure2.in","r",stdin);
    freopen("padure2.out","w",stdout);
    int n,m,c,i,j;
    scanf("%d%d%d",&n,&m,&c);
    fact[0]=1;
    for(i=1;i<=n+m;i++)
        fact[i]=(fact[i-1]*(long long)i)%MOD;
    invFact[n+m]=lgput(fact[n+m],MOD-2);
    for(i=n+m-1;i>=0;i--)
        invFact[i]=(invFact[i+1]*(long long)(i+1))%MOD;
    for(i=1;i<=c;i++)
        scanf("%d%d",&a[i].x,&a[i].y);
    a[0].x=1;
    a[0].y=1;
    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;
    }
    printf("%d\n",d[0]);
    return 0;
}