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 OCaml (4.02.3) (judge verdict: Accepted)

let rec power ( * ) one m = function
  | 0 -> one
  | n when n mod 2 = 0 ->
      power ( * ) one (m * m) (n / 2)
  | n ->
      m * power ( * ) one m (n - 1)

let memoize n f =
  let dp = Hashtbl.create n in
  let rec get x k =
    try k @@ Hashtbl.find dp x with
    | Not_found ->
        f get x @@ fun y ->
          Hashtbl.add dp x y; k y in get

let m = 1000000007
let ( +^ ) x y = (x + y) mod m
let ( *^ ) x y = (x * y) mod m
let inv n = power ( *^ ) 1 n (m - 2)

let () = Scanf.scanf "%d %d %d %d" @@ fun h w a b ->
  let fact = memoize (h + w) @@ fun fact n k ->
    if n <= 1 then k 1
    else fact (n - 1) @@ fun x -> k @@ n *^ x in
  let fact n = fact n @@ fun x -> x in
  let inv_fact = memoize (h + w) @@ fun inv_fact n k ->
    if n <= 1 then k 1
    else inv_fact (n - 1) @@ fun x -> k @@ inv n *^ x in
  let inv_fact n = inv_fact n @@ fun x -> x in
  Printf.printf "%d\n" @@ Array.fold_left ( +^ ) 0 @@ Array.init (h - a) @@ fun i ->
    fact(i + b - 1) *^ fact(h + w - 2 - i - b) *^ inv_fact(i) *^ inv_fact(b - 1) *^ inv_fact(h - i - 1) *^ inv_fact(w - b - 1)