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++14 (GCC 5.4.1) (judge verdict: Accepted)

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

#define MOD 1000000007

long long int factorial[200005]={0};
long long int relay_points[100005]={0};

void set_factorial(int n){
    factorial[0] = 1;
    for(int i=1;i<=n;++i){
        factorial[i] = i * factorial[i-1] % MOD;
    }
}

long long int extgcd(long long int a, long long int b, long long int &x,
                     long long int &y) {
    long long int d = a;
    if (b != 0) {
        d = extgcd(b, a % b, y, x);
        y -= (a / b) * x;
    } else {
        x = 1;
        y = 0;
    }
    return d;
}

// a : 元, md : 法
long long int multi_inv(long long int md, long long int a) {
    long long int x, y;
    extgcd(md, a, x, y);
    return (y > 0 ? y : md + y);
}

int main(){
    long long int h, w, a, b;
    cin >> h >> w >> a >> b;

    set_factorial(h+w);

    for(int i=0;i<w-b;++i){
        long long int tmp = factorial[h-a-1+b+i];
        tmp = tmp * multi_inv(MOD, factorial[h-a-1]) % MOD;
        tmp = tmp * multi_inv(MOD, factorial[b+i]) % MOD;
        relay_points[i] = tmp;
    }

    long long int ans = 0;
    for(int i=0;i<w-b;++i){
        long long int tmp = factorial[a+w-b-i-2];
        tmp = tmp * multi_inv(MOD, factorial[a-1]) % MOD;
        tmp = tmp * multi_inv(MOD, factorial[w-b-i-1]) % MOD;
        ans = (ans + relay_points[i] * tmp % MOD) % MOD;
    }

    cout << ans << endl;

    return 0;
}