Cod sursa(job #1708644)

Utilizator diac_paulPaul Diac diac_paul Data 27 mai 2016 18:11:52
Problema Padure2 Scor Ascuns
Compilator cpp Status done
Runda Marime 1.66 kb
#include <fstream>
#include <algorithm>

#define Mod 666013
#define XMax 1001
#define NMax 1000010
#define ll long long
using namespace std;

ifstream fin("padure2.in");
ofstream fout("padure2.out");

struct Point{
    ll l,c;
    bool operator< (const Point a) const
    {
        return l+c<a.l+a.c;
    }
};


Point points[XMax];
ll C[XMax];

ll fact[2*NMax];

ll n,m;

ll x;

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

ll f(ll l1,ll c1,ll l2,ll c2)
{
    if(l1>l2 || c1>c2)
        return 0;
    if(l1==l2 || c1==c2)
        return 1;

    ll s=0;
    s=fact[l2-l1+c2-c1];

    ll inv = 0;
    ll ins;

    if(!(l2-l1>=Mod || c2-c1>=Mod))
    {
        gcd(inv,ins, fact[l2-l1]*fact[c2-c1], Mod);

        if (inv <= 0)
            inv +=Mod;
        inv %=Mod;

        s = (s * inv ) %Mod;
    }

    return s;
}


void think(ll pos)
{
    C[pos]=f(1,1, points[pos].l, points[pos].c);

    for(ll i=1;i<pos;i++)
    {
        C[pos] -= ( C[i] * f( points[i].l, points[i].c, points[pos].l, points[pos].c) ) % Mod;
        if(C[pos]<0)
            C[pos]+=Mod;

    }
}

int main()
{
    fin>>n>>m;

    fact[1]=1;
    for(ll i=2;i<Mod;i++)
        fact[i]=(fact[i-1]*i)%Mod;

    fin>>x;

    for(ll i=1;i<=x;i++)
        fin>>points[i].l>>points[i].c;

    sort(points+1,points+1+x);

    for(ll i=1;i<=x;i++)
        think(i);

    points[x+1].l=n;
    points[x+1].c=m;

    think(x+1);

    fout<<C[x+1]<<'\n';

    return 0;
}