Cod sursa(job #1858259)

Utilizator silkMarin Dragos silk Data 27 ianuarie 2017 11:15:33
Problema Padure2 Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.46 kb
#include <cstdio>
#include <algorithm>
#define VMax 2000000
#define NMax 1000
#define x first
#define y second
using namespace std;

const int MOD = 2000003;
typedef pair<int, int> per;
per v[NMax+1];
int nr[NMax+1];
int f[VMax+1];

void Precalc()
{
    f[0] = 1;
    for(int i = 1; i <= VMax; ++i) f[i] = (1LL * f[i-1] * i) % MOD;
}

int LgPut(int X, int B)
{
    int A=1;
    while(B)
    {
        if(B%2) A=(1LL*A*X)%MOD;
        X=(1LL*X*X)%MOD;
        B/=2;
    }
    return A;
}

int Comb(int n, int k)
{
    int inv1 = LgPut(f[k],MOD-2);
    int inv2 = LgPut(f[n-k],MOD-2);
    return ( 1LL * ( (1LL * f[n] * inv1) % MOD ) * inv2 ) % MOD;
}

int Get_Comb(int x, int y)
{
    int a,b;
    a = (x+y)-2;
    b = y-1;
    return Comb(a,b);
}

int main(){
    FILE* fin = fopen("padure2.in","r");
    FILE* fout = fopen("padure2.out","w");

    int i,j,N,M,C,res;

    Precalc();
    fscanf(fin,"%d %d %d",&N,&M,&C);
    for(i = 1; i <= C; ++i) fscanf(fin,"%d %d",&v[i].x,&v[i].y);
    sort(v+1,v+C+1);

    res = Get_Comb(N,M);
    for(i = 1; i <= C; ++i) nr[i] = Get_Comb(v[i].x, v[i].y);
    for(i = 1; i <= C; ++i)
    {
        res = (res - 1LL * nr[i] * Get_Comb(N-v[i].x+1, M-v[i].y+1)) % MOD + MOD;
        for(j = i+1; j <= C; ++j)
        if(v[j].y >= v[i].y)
        nr[j] = (nr[j] - 1LL * nr[i] * Get_Comb(v[j].x-v[i].x+1, v[j].y-v[i].y+1)) % MOD + MOD;
    }

    fprintf(fout,"%d",res%MOD);


return 0;
}