Cod sursa(job #2741429)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 15 aprilie 2021 23:08:18
Problema Padure2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 1.66 kb
#include<bits/stdc++.h>
using namespace std;
int n,m,c;
pair<int,int> v[1005];
const int maxD=(1e6)+5;
long long fact[maxD];
const int mod=2000003;

int dp[1005];


inline long long fastexp(int a,int b)
{
    long long res=1;
    while(b)
    {
        if(b&1)
        {
            res=(1LL*res*a)%mod;
            b--;
        }
            else
        {
                a=(1LL*a*a)%mod;
                b>>=1;
        }
    }

    return res;

}

inline int C(int n,int k)
{
    if(!k) return 1;

    long long sol=fact[n];
    sol=(1LL*sol*fastexp(fact[k],mod-2))%mod;
    sol=(1LL*sol*fastexp(fact[n-k],mod-2))%mod;
    return sol;
}
int main()
{
    freopen("padure2.in","r",stdin);
    freopen("padure2.out","w",stdout);

    scanf("%d%d",&n,&m);

    scanf("%d",&c);
    int dv=0;

    for(int i=1;i<=c;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            if(x<1 || y<1) continue;
            if(x>n || y>m) continue;
            v[++dv]=make_pair(x,y);
        }

    c=dv;
    fact[0]=1;

    for(int i=1;i<=1000000;i++)
        fact[i]=(1LL*fact[i-1]*i)%mod;

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


    v[0]=make_pair(1,1);
    v[c+1]=make_pair(n,m);

    dp[0]=1;

    for(int i=1;i<=c+1;i++)
    {
        dp[i]=C(v[i].first+v[i].second-2,v[i].first-1);


        for(int j=i-1;j>=1;j--)
        {
            if(v[j].second>v[i].second) continue;
            int roads=C(v[i].first-v[j].first+v[i].second-v[j].second,v[i].first-v[j].first);
            int fact=(1LL*roads*dp[j])%mod;
            dp[i]=(dp[i]-fact+mod)%mod;
        }
    }

    printf("%d\n",dp[c+1]);

    return 0;
}