X,Y=list(map(int,input().split()))

if (X+Y)%3!=0:

  print((0))

  exit()

A=int((X+Y)/3)

B=int((2*Y-X)/3)

if A<0 or B<0:

  print((0))

  exit()

MOD=10**9+7

def comb(n,k):

  tmp=1

  for i in range(n-k+1,n+1):

    tmp*=i

    tmp%=MOD

  for i in range(1,k+1):

    tmp*=pow(i,MOD-2,MOD)

    tmp%=MOD

  return tmp

ans = comb(A,B)

print((ans%MOD))
#ika　tako

def prepare(n, MOD):

    f = 1

    for m in range(1, n + 1):

        f = f * m % MOD

        #print(f)

    fn = f#n!を求める

    #print(fn)

 

    #print(f)

    inv = pow(f, MOD - 2, MOD)

    #print(inv)

    invs = [1] * (n + 1)#[1, 1, 1]のイメージ、逆元？格納テーブル

    #print(invs)　　⇒　[1, 1, 1]のイメージ、逆元格納テーブル

    invs[n] = inv

    for m in range(n, 1, -1):#n*(n-1)*(n-2)*...と上から掛けている

        inv = inv * m % MOD#なぜ、下から掛けない？

        invs[m - 1] = inv

 

    return fn, invs

 

def solve(x, y):

    d, m = divmod(x + y, 3)#商と余り

    if m != 0 or x < d or y < d:

    #Xとyの合計は3の倍数、x、yがd移動回数以下はあり得ない（1回1個は進む）

        return 0

    #c = d - x　　これだと範囲外参照でエラー

    c = abs(d - x)

 

    MOD = 10 ** 9 + 7

    f, invs = prepare(d, MOD)

    return f * invs[c] * invs[d - c] % MOD

  #fはn!、invs[c],invs[d - c] はc!,(d-c)!の逆元？

  #nCr=n!/(r!*(n-r)!)

  

x, y = list(map(int, input().split()))

print((solve(x, y)))
X, Y = list(map(int, input().split()))
if (X + Y) % 3 != 0:
    print((0))
    exit()
A = int((X + Y) / 3)
B = int((2 * Y - X) / 3)
if A < 0 or B < 0:
    print((0))
    exit()
MOD = 10**9 + 7


def comb(n, k):
    tmp = 1
    for i in range(n - k + 1, n + 1):
        tmp *= i
        tmp %= MOD
    for i in range(1, k + 1):
        tmp *= pow(i, MOD - 2, MOD)
        tmp %= MOD
    return tmp


ans = comb(A, B)
print((ans % MOD))

# ika　tako
def prepare(n, MOD):
    f = 1
    for m in range(1, n + 1):
        f = f * m % MOD
        # print(f)
    fn = f  # n!を求める
    # print(fn)
    # print(f)
    inv = pow(f, MOD - 2, MOD)
    # print(inv)
    invs = [1] * (n + 1)  # [1, 1, 1]のイメージ、逆元？格納テーブル
    # print(invs)　　⇒　[1, 1, 1]のイメージ、逆元格納テーブル
    invs[n] = inv
    for m in range(n, 1, -1):  # n*(n-1)*(n-2)*...と上から掛けている
        inv = inv * m % MOD  # なぜ、下から掛けない？
        invs[m - 1] = inv
    return fn, invs


def solve(x, y):
    d, m = divmod(x + y, 3)  # 商と余り
    if m != 0 or x < d or y < d:
        # Xとyの合計は3の倍数、x、yがd移動回数以下はあり得ない（1回1個は進む）
        return 0
    # c = d - x　　これだと範囲外参照でエラー
    c = abs(d - x)
    MOD = 10**9 + 7
    f, invs = prepare(d, MOD)
    return f * invs[c] * invs[d - c] % MOD


# fはn!、invs[c],invs[d - c] はc!,(d-c)!の逆元？
# nCr=n!/(r!*(n-r)!)
x, y = list(map(int, input().split()))
print((solve(x, y)))

-X, Y = list(map(int, input().split())) -if (X + Y) % 3 != 0: -    print((0)) -    exit() -A = int((X + Y) / 3) -B = int((2 * Y - X) / 3) -if A < 0 or B < 0: -    print((0)) -    exit() -MOD = 10**9 + 7 +# ika　tako +def prepare(n, MOD): +    f = 1 +    for m in range(1, n + 1): +        f = f * m % MOD +        # print(f) +    fn = f  # n!を求める +    # print(fn) +    # print(f) +    inv = pow(f, MOD - 2, MOD) +    # print(inv) +    invs = [1] * (n + 1)  # [1, 1, 1]のイメージ、逆元？格納テーブル +    # print(invs)　　⇒　[1, 1, 1]のイメージ、逆元格納テーブル +    invs[n] = inv +    for m in range(n, 1, -1):  # n*(n-1)*(n-2)*...と上から掛けている +        inv = inv * m % MOD  # なぜ、下から掛けない？ +        invs[m - 1] = inv +    return fn, invs -def comb(n, k): -    tmp = 1 -    for i in range(n - k + 1, n + 1): -        tmp *= i -        tmp %= MOD -    for i in range(1, k + 1): -        tmp *= pow(i, MOD - 2, MOD) -        tmp %= MOD -    return tmp +def solve(x, y): +    d, m = divmod(x + y, 3)  # 商と余り +    if m != 0 or x < d or y < d: +        # Xとyの合計は3の倍数、x、yがd移動回数以下はあり得ない（1回1個は進む） +        return 0 +    # c = d - x　　これだと範囲外参照でエラー +    c = abs(d - x) +    MOD = 10**9 + 7 +    f, invs = prepare(d, MOD) +    return f * invs[c] * invs[d - c] % MOD -ans = comb(A, B) -print((ans % MOD)) +# fはn!、invs[c],invs[d - c] はc!,(d-c)!の逆元？ +# nCr=n!/(r!*(n-r)!) +x, y = list(map(int, input().split())) +print((solve(x, y)))