如题
#include<bits/stdc++.h>
#define int long long
using namespace std;
int h,w,n,mod=1e9+7,dp[60005];
struct poi{
int x,y;
}a[60005];
bool cmp(poi x,poi y){if(x.x==y.x) return x.y<y.y; return x.x<y.x;}
int fac[200005],facinv[200005];
int qpow(int x,int y){
int ans=1;
while(y){
if(y&1) ans=ans*x%mod;
x=x*x%mod;
y>>=1;
}
return ans;
}
int c(int N,int M){
return fac[N]*facinv[M]%mod*facinv[N-M]%mod;
}
signed main(){
scanf("%lld%lld%lld",&h,&w,&n);
for(int i = 1;i<=n;i++)
scanf("%lld%lld",&a[i].x,&a[i].y);
sort(a+1,a+1+n,cmp);
fac[0]=fac[1]=1;
for(int i = 2;i<=200003;i++){
fac[i]=fac[i-1]*i%mod;
}
facinv[200001]=qpow(fac[200001],mod-2);
for(int i = 200000;i>=0;i--){
facinv[i]=facinv[i+1]*(i+1)%mod;
// facinv[i]=qpow(fac[i],mod-2);
} //cout<<facinv[0]<<endl;
a[0].y=a[0].x=0;
a[n+1].x=h,a[n+1].y=w;
for(int i = 1;i<=n+1;i++){
dp[i]=c(a[i].x+a[i].y-2,a[i].x-1);
for(int j = 1;j<i;j++){
if(a[i].x<a[j].x||a[i].y<a[j].y) continue;
dp[i]=dp[i]-dp[j]*c(a[i].x-a[j].x+a[i].y-a[j].y,a[i].x-a[j].x)%mod;
}
}
printf("%lld",(dp[n+1]+mod)%mod);
return 0;
}