The Dynamic Programming is extensive and profound!
This problem you should think from the black cells
Code of AC:
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long ll;
const ll N=2010;
const ll M=1e9+7;
pair<ll,ll> A[N];
ll f[N];
ll JC[200010],JCinv[200010];
ll C(ll n,ll m){
return JC[n]*JCinv[m]%M*JCinv[n-m]%M;
}
ll quickmod(ll a,ll b,ll M){
ll c=1;
for(;b;b>>=1){
if(b&1) c=c*a%M;
a=a*a%M;
}
return c;
}
int main(){
JC[0]=1;JCinv[0]=1;
for(ll i=1;i<=200000;++i){
JC[i]=JC[i-1]*i%M;
JCinv[i]=quickmod(JC[i],M-2,M);
}
ll a,b,n;
cin>>a>>b>>n;
for(ll i=1;i<=n;++i){
cin>>A[i].x>>A[i].y;
}
sort(A+1,A+1+n);
A[n+1].x=a,A[n+1].y=b;
for(ll i=1;i<=n+1;++i){
f[i]=C(A[i].x+A[i].y-2,A[i].x-1);
for(ll j=1;j<i;++j){
if(A[j].x>A[i].x||A[j].y>A[i].y) continue;
f[i]=(f[i]-f[j]*C(A[i].x+A[i].y-A[j].x-A[j].y,A[i].x-A[j].x))%M;
}
}
cout<<(f[n+1]+M)%M<<endl;
}