Cod sursa(job #1713066)

Utilizator andreiudilaUdila Andrei andreiudila Data 4 iunie 2016 16:18:39
Problema Padure2 Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.58 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("padure2.in");
ofstream fout("padure2.out");

long long n,c,i,j,m,x,y,nr;
long long fact[2000001];
long long dp[1002];
struct ciuperci{

long long x,y;

}v[1001];

bool cmp(ciuperci a, ciuperci b)
{
    if(a.x<b.x) return 1;
    else if(a.x==b.x) return a.y<b.y;
    else return 0;
}
long long put(long long n, long long p)
{
    long long rez=1;

    while(p>0)
    {
        if(p%2==0)
        {
            n=(n*n)%2000003;
            p/=2;
        }
        else
        {
            rez=(rez*n)%2000003;
            p--;
        }
    }
    return rez%2000003;
}
long long combinari(long long n, long long k)
{
    long long rez=put(fact[k], 2000001);



    rez=rez*put(fact[n-k],2000001);
    rez%=2000003;

    rez*=fact[n];
    rez%=2000003;

    return rez;
}
int main()
{
    fin>>n>>m;
    fin>>c;

    for(i=1;i<=c;++i)
        fin>>v[i].x>>v[i].y;

    sort(v+1,v+c+1,cmp);

    fact[0]=1;

    for(i=1;i<=2000000;++i)
        fact[i]=(fact[i-1]*i)%2000003;


    if(v[c].x==n && v[c].y==m) {fout<<"0"; return 0; }

    c++; v[c].x=n; v[c].y=m;



    for(i=1;i<=c;++i)
    {
        nr=combinari(v[i].x+v[i].y-2,v[i].y-1);

        for(j=1;j<i;++j)
        {
            if(v[j].y<=v[i].y)
               {

                nr-=(dp[j]*combinari(v[i].x-v[j].x+v[i].y-v[j].y,v[i].y-v[j].y))%2000003;
                if(nr<0) nr+=2000003;
               }
        }

        dp[i]=nr;

    }

    fout<<dp[c];




    return 0;
}