哪里错了?
  • 板块AT_dp_y Grid 2
  • 楼主Istruggle
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/10 20:28
  • 上次更新2024/7/10 22:10:12
查看原帖
哪里错了?
873417
Istruggle楼主2024/7/10 20:28

如题

#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;
}
2024/7/10 20:28
加载中...