Cod sursa(job #1710482)

Utilizator UBB_RANDOMUBB Muntea Zsisku Adam UBB_RANDOM Data 29 mai 2016 00:22:11
Problema Padure2 Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.93 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);
     }
}

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;
}



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;
    for(i=1; i<2000100; i++){
        fac[i]=(fac[i-1]*i)%MOD;
        if(fac[i]<0)fac[i]+=MOD;
    }
    long long int sol;
    sol=(((1LL*fac[n+m-2]*invers(fac[n-1]))%MOD)*invers(fac[m-1]))%MOD;
    memset(cost, 0, 1010*sizeof(int));
    long long int dist;
    for(int i=0; i<ciup.size(); i++){
        dist=((1LL*fac[ciup[i].first+ciup[i].second-2]*invers(fac[ciup[i].first-1]))%MOD*invers(fac[ciup[i].second-1]))%MOD;
        if(dist<0)dist+=MOD;
        dist-=cost[i];
        sol=(sol-dist*((1LL*fac[n+m-ciup[i].first-ciup[i].second]*invers(fac[n-ciup[i].first]))%MOD*invers(fac[m-ciup[i].second]))%MOD)%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*((1LL*fac[ciup[j].first+ciup[j].second-ciup[i].first-ciup[i].second]*invers(fac[ciup[j].first-ciup[i].first]))%MOD*invers(fac[ciup[j].second-ciup[i].second]))%MOD)%MOD;
            //??
        }
    }
    if(sol<MOD)sol+=MOD;
    g<<sol;
    f.close();
    g.close();
    return 0;
}