Problem:
Score : 400 points

Problem Statement

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 10^9+7.

Constraints

1 ≦ H, W ≦ 100,000

1 ≦ A < H

1 ≦ B < W

Input

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

H W A B

Output

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

Sample Input 1

2 3 1 1

Sample Output 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".

Sample Input 2

10 7 3 4

Sample Output 2

3570

There are 12 forbidden cells.

Sample Input 3

100000 100000 99999 99999

Sample Output 3

1

Sample Input 4

100000 100000 44444 55555

Sample Output 4

738162020

Solution in C++ (GCC 9.2.1) (judge verdict: Runtime Error)

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

typedef long long ll;
#define fastInp cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);

const ll MOD = 1e9 + 7;
vector<ll> fact;

ll binpow (ll a, ll n, ll md) {
	if (n == 0)
		return 1;
	if (n % 2 == 1)
		return (binpow (a, n-1, md) * a) % md;
	else {
		ll b = binpow (a, n/2, md);
		return (b * b) % md;
	}
}

ll cages(ll n, ll k) {
    return (fact[n] * binpow((fact[k] * fact[n - k]) % MOD, MOD - 2, MOD)) % MOD;
}

int main()
{
    fastInp;

    ll h, w, a, b;
    cin >> h >> w >> a >> b;
    ll cr = max(max(h, w), max(a, b));
    fact.push_back(1);
    for (ll i= 1; i <= cr + 10; i++) fact.push_back((fact.back() * i) % MOD);

    ll ans = 0, s = 0;
    for (int i = a; i < h; i++) {
        ll cur = 0;
        cur += (cages(b + i - a - 1, i - a) * cages(h + w - (i - a) - b - 2, w - b - 1)) % MOD;

        ans += cur;
        ans += MOD;
        ans %= MOD;
    }

    cout << ans;
    return 0;    
}