Cod sursa(job #1710676)

Utilizator iulianrotaruRotaru Gheorghe-Iulian iulianrotaru Data 29 mai 2016 16:45:33
Problema Padure2 Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.09 kb
# include <bits/stdc++.h>
using namespace std;
# define x first
# define y second
const int Xp=2000003;
int dp[1<<10];
pair <int,int> s[1<<10];
int i,j,f[1<<21];
int pw(int a,int b)
{
    int ans=1;
    while(b)
    {
        if(b&1) ans=(1LL*ans*a)%Xp;
        a=(1LL*a*a)%Xp;
        b>>=1;
    }
    return ans;
}
int C(int a,int b)
{
    return (((1LL*f[b]*pw(f[a],Xp-2)%Xp)*pw(f[b-a],Xp-2)))%Xp;
}
int main(void)
{
    ifstream fi("padure2.in");
    ofstream fo("padure2.out");
    int h,w,n;
    fi>>h>>w>>n;
    for(i=1;i<=n;++i) fi>>s[i].x>>s[i].y;
    sort(s+1,s+n+1);
    s[++n]={h,w};
    f[0]=1;
    const int N=2e6;
    for(i=1;i<=N;++i) f[i]=1ll*i*f[i-1]%Xp;
    for(i=1;i<=n;++i)
    {
        dp[i]=C(s[i].x-1,s[i].x+s[i].y-2);
        for(j=i-1;j;--j)
            if(s[j].x<=s[i].x&&s[j].y<=s[i].y)
            {
                int p=C(s[i].x-s[j].x,s[i].x+s[i].y-s[j].x-s[j].y);
                p=1LL*p*dp[j]%Xp;
                dp[i]-=p;
                if(dp[i]<0) dp[i]+=Xp;
            }
        dp[i]%=Xp;
    }
    fo<<dp[n];
    return 0;
}