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 (Python):
def Combination_mod(n, k):
    ret = f[n]
    ret = (ret * finv[k]) % mod
    ret = (ret * finv[n - k]) % mod
    return ret

mod = 1000000007
h, w, a, b = map(int,input().split())

x = []
xi = b
xj = h - a - 1
while xi < w and xj >= 0:
    x.append([xi, xj])
    xi += 1
    xj -= 1

n = w + h
f = [0] * n
finv = [0] * n

f[0] = 1
finv[0] = finv[1] = 1
for i in range(1, n):
    f[i] = (f[i - 1] * i) % mod

finv[n - 1] = pow(f[n - 1], mod - 2, mod)
for i in range(n - 2, 1, -1):
    finv[i] = ((i + 1) * finv[i + 1]) % mod

ans = 0
for i, j in x:
    ans1 = Combination_mod(i + j, i)
    ans1 *= Combination_mod(w - 1 - i + h - 1 - j, w - 1 - i)
    ans += ans1
    ans %= mod

print(ans)

Solution (Python):
C = int(1e9) + 7
h, w, a, b = [int(x) for x in input().split()]



def pow(n):
    ans = n
    for i in range(1, 30):
        n = (n * n) % C
        if i in {29, 28, 27, 25, 24, 23, 20, 19, 17, 15, 14, 11, 9, 2}:
            ans = (ans * n) % C
    return ans

fact = [1]
factinv = [1] 
for x in range(1, h + w - 2):
    fact.append((x * fact[x - 1]) % C)
    
    factinv.append((pow(x) * factinv[x - 1]) % C)

def nCr(n, r):
    return (fact[n] * factinv[r] * factinv[n - r]) % C

ans = 0
for i in range(b, w):
    ans = (ans + nCr(i + h - a - 1, h - a - 1) * nCr(a - 1 + w - i - 1, a - 1)) % C

print(ans)