Problem:
 Score : 1600 points    Problem Statement A + B balls are arranged in a row.
The leftmost A balls are colored red, and the rightmost B balls are colored blue.  You perform the following operation:   First, you choose two integers s, t such that 1 \leq s, t \leq A + B .  Then, you repeat the following step A + B times:
In each step, you remove the first ball or the s -th ball (if it exists) or the t -th ball (if it exists, all indices are 1-based) from left in the row, and give it to Snuke.   In how many ways can you give the balls to Snuke?
Compute the answer modulo 10^9 + 7 .  Here, we consider two ways to be different if for some k , the k -th ball given to Snuke has different colors.
In particular, the choice of s, t doesn't matter.
Also, we don't distinguish two balls of the same color.      Constraints  1 \leq A, B \leq 2000         Input Input is given from Standard Input in the following format:  A  B       Output Print the answer.        Sample Input 1 3 3      Sample Output 1 20  There are 20 ways to give 3 red balls and 3 blue balls.
It turns out that all of them are possible.  Here is an example of the operation ( r stands for red, b stands for blue):   You choose s = 3, t = 4 .  Initially, the row looks like rrrbbb .  You remove 3 rd ball ( r ) and give it to Snuke. Now the row looks like rrbbb .  You remove 4 th ball ( b ) and give it to Snuke. Now the row looks like rrbb .  You remove 1 st ball ( r ) and give it to Snuke. Now the row looks like rbb .  You remove 3 rd ball ( b ) and give it to Snuke. Now the row looks like rb .  You remove 1 st ball ( r ) and give it to Snuke. Now the row looks like b .  You remove 1 st ball ( b ) and give it to Snuke. Now the row is empty.   This way, Snuke receives balls in the order rbrbrb .       Sample Input 2 4 4      Sample Output 2 67  There are 70 ways to give 4 red balls and 4 blue balls.
Among them, only bbrrbrbr , brbrbrbr , and brrbbrbr are impossible.       Sample Input 3 7 9      Sample Output 3 7772       Sample Input 4 1987 1789      Sample Output 4 456315553

Solution (Python):
from numpy import *
A,B=map(int,input().split())
M=10**9+7
U=2001
C=zeros((U,U),int64)
C[0,0]=1
for n in range(1,U):
  C[n,1:]+=C[n-1,:-1]
  C[n,:-1]+=C[n-1,:-1]
  C[n]%=M
S=zeros_like(C)
S[0]=1
S[1:]=(C[:-1].cumsum(axis=1)%M).cumsum(axis=1)%M
print(sum(C[B-1,k]*(sum(S[k,:A-k+1])%M)%M for k in range(A+1))%M)

Solution (Python):
import sys
read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines

import numpy as np

A,B = map(int,read().split())

MOD = 10 ** 9 + 7

U = 2001
comb = np.zeros((U,U),np.int64)
comb[0,0] = 1
for n in range(1,U):
    comb[n,0:n] += comb[n-1,0:n]
    comb[n,1:n+1] += comb[n-1,0:n]
    comb[n,:n+1] %= MOD

comb_cum = comb.cumsum(axis=1)


S = np.zeros((U,U),np.int64)
S[0,:] = 1
S[1:,:] = comb_cum[:-1].cumsum(axis=1) % MOD

x = 0
for k in range(A+1):
    x += comb[B-1,k] * (S[k,:A-k+1].sum() % MOD) % MOD
x %= MOD
print(x)