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 3rd ball (r) and give it to Snuke. Now the row looks like rrbbb.

You remove 4th ball (b) and give it to Snuke. Now the row looks like rrbb.

You remove 1st ball (r) and give it to Snuke. Now the row looks like rbb.

You remove 3rd ball (b) and give it to Snuke. Now the row looks like rb.

You remove 1st ball (r) and give it to Snuke. Now the row looks like b.

You remove 1st 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



Sample input:
3 3


Sample output:
20

Submission status: Wrong Answer

Solution code:
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)))

Submission status: Accepted

Solution code:
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)

Submission status: Accepted

Solution code:
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)

# (1,s) しか使えない場合. (青、赤) -> 数え上げ
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)