Cod sursa(job #1710686)

Utilizator iulianrotaruRotaru Gheorghe-Iulian iulianrotaru Data 29 mai 2016 17:02:40
Problema Padure2 Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 2.01 kb
#include <bits/stdc++.h>
#define x first
#define y second
#define cin f
#define cout g
using namespace std;
ifstream f("padure2.in");
ofstream g("padure2.out");
const int kMaxN=2e4+5,Xp=2000003,kMaxH=2e6+5;
int i,j,x[kMaxN],y[kMaxN];
int pow(int a,int p){
    int rez=1;
    while(p)
    {
        if(p&1) rez=(1LL*rez*a)%Xp;
        a=(1LL*a*a)%Xp;
        p>>=1;
    }
    return rez;
}
int fact[kMaxH],invFact[kMaxH];
int dp[2][kMaxN];
pair <int,int> c[kMaxN];
int howMany(pair<int, int> a, pair<int, int> b)
{
    if (a.x <= b.x and a.y <= b.y)
        return (1LL*((1LL*fact[b.x-a.x+b.y-a.y]*invFact[b.x-a.x])%Xp)*invFact[b.y-a.y])%Xp;
    else
    {
        if(a.x>=b.x&&a.y>=b.y) return howMany(b,a);
        else return 0;
    }
}
int howMany(int a, int b, pair<int, int> c){
    return howMany(make_pair(a,b),c);
}
int howMany(pair<int,int> a,int c,int d){
    return howMany(c,d,a);
}
int howMany(int a,int b,int c,int d){
    return howMany(make_pair(a,b),make_pair(c,d));
}
void mod(int &a)
{
    if(a<0) a+=Xp;
    if(a>=Xp) a-=Xp;
}
int main()
{
	ios::sync_with_stdio(false);
    int h,w,n;
    cin>>h>>w>>n;
    for(i=1;i<=n;++i)
        cin>>c[i].x>>c[i].y;
    sort(c+1,c+n+1);
    fact[0]=1;
    for(i=1;i<kMaxH;++i)
        fact[i]=(1LL*fact[i-1]*i)%Xp;
    invFact[kMaxH-1]=pow(fact[kMaxH-1],Xp-2);
    for(i=kMaxH-2;i;--i)
        invFact[i]=(1LL*invFact[i+1]*(i+1))%Xp;
    invFact[0] = 1;
    int rez=howMany(1,1,h,w);
    for(i=1;i<=n;++i)
        dp[0][i]=howMany(1,1,c[i]);
    for(i=1;i<=n;++i)
    {
        rez-=(1LL*dp[0][i]*howMany(c[i],h,w))%Xp;
        rez+=(1LL*dp[1][i]*howMany(c[i],h,w))%Xp;
        mod(rez);
        for(j=i+1;j<=n;++j)
        {
            int exp=howMany(c[i],c[j]);
            if(exp)
            {
                dp[0][j]+=(1LL*dp[1][i]*exp)%Xp;
                dp[1][j]+=(1LL*dp[0][i]*exp)%Xp;
                mod(dp[0][j]);
                mod(dp[1][j]);
            }
        }
    }
    cout<<rez;
	return 0;
}