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
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
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; }