Iroha and a Grid(组合数学,逆元)

编程入门 行业动态 更新时间:2024-10-06 12:32:17

Iroha and a Grid(<a href=https://www.elefans.com/category/jswz/34/1769978.html style=组合数学,逆元)"/>

Iroha and a Grid(组合数学,逆元)

Iroha and a Grid

时间限制: 1 Sec  内存限制: 128 MB

题目描述

We have a large square grid with H rows and W columns. Iroha is now standing in the top-left cell. She will repeat going right or down to the adjacent cell, until she reaches the bottom-right cell.
However, she cannot enter the cells in the intersection of the bottom A rows and the leftmost B columns. (That is, there are A×B forbidden cells.) There is no restriction on entering the other cells.
Find the number of ways she can travel to the bottom-right cell.
Since this number can be extremely large, print the number modulo 109+7.

Constraints
1≤H,W≤100,000
1≤A<H
1≤B<W

输入

The input is given from Standard Input in the following format:

H W A B

输出

Print the number of ways she can travel to the bottom-right cell, modulo 109+7.

样例输入

2 3 1 1

样例输出

2

提示

We have a 2×3 grid, but entering the bottom-left cell is forbidden. The number of ways to travel is two: "Right, Right, Down" and "Right, Down, Right".

 

 

 

来个超时的代码,实际上应该打一个N!的表

#include <bits/stdc++.h>
#define mod 1000000007
using namespace std;
typedef long long ll;ll x,y;ll extgcd(ll a, ll b, ll &x, ll &y)
{if (b == 0){x = 1;y = 0;return a;}ll gcd = extgcd(b, a % b, x, y);ll tmp = x;x = y;y = tmp - (a/b) * y;return gcd;
}ll J(ll n,ll x)
{ll ans = 1;for(ll i=x;i<=n;i++)ans = (ans*i)%mod;return ans;
}ll C(ll m,ll n)
{extgcd(J(m,2),mod,x,y);return J(n,n-m+1)*(x+mod)%mod;
}int main()
{ll h,w,A,B;cin>>h>>w>>A>>B;ll ans=0;for(ll i=B+1;i<=w;i++){ll tmp=(C(h-A-1,i-1+h-A-1)*C(w-i,w-i+A-1))%mod;ans=(ans+tmp)%mod;}cout<<ans<<endl;return 0;
}

打表后AC

#include <bits/stdc++.h>
#define mod 1000000007
using namespace std;
typedef long long ll;ll JE[200010];ll x,y;ll extgcd(ll a, ll b, ll &x, ll &y)
{if (b == 0){x = 1;y = 0;return a;}ll gcd = extgcd(b, a % b, x, y);ll tmp = x;x = y;y = tmp - (a/b) * y;return gcd;
}ll C(ll m,ll n)
{extgcd(JE[m]*JE[n-m]%mod,mod,x,y);return JE[n]*(x+mod)%mod;
}int main()
{ll h,w,A,B;JE[0]=1;for(ll i=1;i<200005;i++)JE[i]=(JE[i-1]*i)%mod;cin>>h>>w>>A>>B;ll ans=0;for(ll i=B+1;i<=w;i++){ll tmp=(C(h-A-1,i-1+h-A-1)*C(w-i,w-i+A-1))%mod;ans=(ans+tmp)%mod;}cout<<ans<<endl;return 0;
}

 

 

 

更多推荐

Iroha and a Grid(组合数学,逆元)

本文发布于:2024-02-28 11:37:08,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1769298.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:组合   数学   Iroha   Grid

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!