Cod sursa(job #1710596)

Utilizator UBB_RANDOMUBB Muntea Zsisku Adam UBB_RANDOM Data 29 mai 2016 12:47:37
Problema Padure2 Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 2.08 kb
#include <fstream>
#include <iostream>
#include <string.h>
#define MOD 2000003
#include<vector>
#include<map>
using namespace std;

map<int, int> inv;
int fac[2000100];
int cost[1010];

ifstream f("padure2.in");
ofstream g("padure2.out");

void gcd(int &x, int &y, int a, int b)
{
     if (!b)
         x = 1, y = 0;
     else
     {
         gcd(x, y, b, a % b);
         int aux = x;
         x = y;
         y = (aux - y * (a / b))%MOD;
     }
}

int invers(int n){
    if(inv.find(n)!=inv.end()){
        return inv[n];
    }
    int sol, x;
    gcd(sol, x, n, MOD);
    if(sol<MOD)sol+=MOD;
    inv[n]=sol;
    return sol;
}



long long comb(int xs, int ys, int xf, int yf){
    if(xf<xs || yf<ys){
        return 0;
    }
    long long int sol;
    sol=((1LL*fac[xf+yf-xs-ys]*invers(fac[xf-xs]))%MOD*invers(fac[yf-ys]))%MOD;
    if(sol<0)sol+=MOD;
    return sol;
}


int main()
{

    int i, x, y;
    int n, m, c;
    vector<pair<int, int> > ciup;
    f>>n>>m>>c;
    for(i=0; i<c; i++)
    {
        f>>x>>y;
        ciup.push_back(pair<int, int>(x, y));
    }
    fac[0]=1;
    long long int w=1;
    for(i=1; i<2000100; i++){
        w=(w*i)%MOD;
        fac[i]=w%MOD;
        while(fac[i]<0)fac[i]+=MOD;

    }
    long long int sol, aa, bvb, cc;
    aa=fac[n+m-2];
    bvb=invers(fac[n-1]);
    cc=invers(fac[m-1]);
    //cout<<aa<<" "<<bvb<<" "<<cc;
    sol=comb(1, 1, n, m);
    memset(cost, 0, 1010*sizeof(int));
    long long int dist;
    for(int i=0; i<ciup.size(); i++){
        dist=comb(1, 1, ciup[i].first, ciup[i].second);
        if(dist<0)dist+=MOD;
        dist-=cost[i];
        sol=(sol-dist*comb(ciup[i].first, ciup[i].second, n, m))%MOD;
        for(int j=i+1; j<ciup.size(); j++){
            //if(!(ciup[j].first<ciup[i].first || ciup[j].second<ciup[i].second))
                cost[j]=(cost[j]+((dist*comb(ciup[i].first, ciup[i].second, ciup[j].first, ciup[j].second))%MOD))%MOD;
            //??
        }
    }
    if(sol<0)sol+=MOD;
    g<<sol<<"\n";
    f.close();
    g.close();
    return 0;
}