题目链接http://acm./problem/1102
显然对于 1 ,y列不可取, 1,x行不可取。 先令x–,y-- 表示不取x行y列。只需要枚举当前需要多少步到达(x,y)即可。【1,x】步 ,那么对于可取的x,y范围内我们要取当前步数的组合数。
#include<bits/stdc++.h>#define fuck(x) std::cout<<"["<<#x<<"->"<<x<<"]"<<endl;using namespace std;typedef long long ll;const int M = 2e5 + 5;const int inf = 1e9 + 5;const int maxn = 1e5 + 5;ll Jc[maxn];ll a[maxn];ll mod = 1e9 + 7;void calJc(ll mod) {Jc[0] = Jc[1] = 1;for (ll i = 2; i < maxn; i++)Jc[i] = Jc[i - 1] * i % mod;}ll pow(ll a, ll n, ll p) {//快速幂ll ans = 1;while (n) {if (n & 1)ans = ans * a % p;a = a * a % p;n >>= 1;}return ans;}ll niYuan(ll a, ll b) {return pow(a, b - 2, b);}ll C(ll a, ll b, ll mod) {return Jc[a] * niYuan(Jc[b], mod) % mod* niYuan(Jc[a - b], mod) % mod;}int main() {calJc(mod);int n,x,y,m;scanf("%d%d%d%d",&n,&m,&x,&y);x--,y--;int mx=min(x,y);ll ans=0;while(mx>0) {int xx=x-mx,yy=y-mx;ans=(ans+C(mx+xx-1,mx-1,mod)%mod*C(mx+yy-1,mx-1,mod)%mod)%mod;mx--;}printf("%d\n",ans);}
如果觉得《CSUSTOJ 论演员的自我修养(组合数学)》对你有帮助,请点赞、收藏,并留下你的观点哦!