【DP】求调
查看原帖
【DP】求调
857626
_RainCappuccino_楼主2023/7/19 11:19

【题目】

Code

#include<bits/stdc++.h>
using namespace std;

#define M 200010
#define N 3010
#define int long long

#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define fr(i,j,k) for(int i=j;i<=k;++i)
#define rs(i,j,k) for(int i=j;i>=k;--i)
#define endl '\n'
#define IOS ios::sync_with_stdio(0)
#define pb(i) push_back(i)
#define pf(i) push_front(i)
#define mem(a,b) memset(a,b,sizeof a)
#define fx first
#define fy second

const int mod = 1000000000 + 7;
typedef pair<int,int> Pii;

Pii b[N];

int n,h,w;
int dp[N];
int fac[M],inv[M];

int fpow(int a, int b, const int p) {
	int res = 1;
	while (b) {
		if (b & 1) res = (res * a) % p;
		a = (a * a) % p;
		b >>= 1;
	}
	return res;
}
int C(int n, int m, int p) {
	if (m > n) return 0;
	return  (fac[n] * inv[m]) % p * inv[n - m] % p;
}
signed main() {
	IOS;
	cin >> h >> w;
	cin >> n;
	b[n + 1] = {h,w};
	fac[0] = 1;
	fr(i,1,h + w){
		fac[i] = fac[i - 1] * i;
		fac[i] %= mod;
		inv[i] = fpow(fac[i],mod - 2,mod);
		cout << inv[i] << endl;
	}
	fr(i,1,n){
		cin >> b[i].fx >> b[i].fy;
	}
	sort(b + 1,b + 1 + n + 1);
	dp[0] = 1;
	fr(i,1,n + 1){
		dp[i] = C(b[i].fx + b[i].fy - 2,b[i].fx - 1,mod);
		fr(j,1,i - 1){
			if(b[i].fy >= b[j].fy) dp[i] -= dp[j] * C(b[i].fx - b[j].fx + b[i].fy - b[j].fy,b[i].fx - b[j].fx,mod) % mod;
			dp[i]=(dp[i]%mod+mod)%mod;
		}
	}
	cout << dp[n + 1];
	return 0;
}
2023/7/19 11:19
加载中...