# nCrの左項には nn しか来ない場合、1!～(n-1)!は保持しなくてよいバージョン 

def prepare(n, MOD):

  # n! の計算

  f = 1

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

    f *= m

    f %= MOD

  fn = f

  # n!^-1 の計算

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

  # n!^-1 - 1!^-1 の計算

  invs = [1]*(n+1)

  invs[n] = inv

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

    inv *= m

    inv %= MOD

    invs[m-1] = inv

    

  return fn, invs



MOD = 10**9+7

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



d, m = divmod(x+y, 3)

if m != 0 or x/y > 2 or y/x > 2:

  print((0))

  exit()

c = abs(d-x)

f, invs = prepare(d, MOD)

ans = f * invs[c] * invs[d-c] % MOD

print(ans)
# nCr mod m

# rがn/2に近いと非常に重くなる

def combination(n, r, mod=10**9+7):

    n1, r = n+1, min(r, n-r)

    numer = denom = 1

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

        numer = numer * (n1-i) % mod

        denom = denom * i % mod

    return numer * pow(denom, mod-2, mod) % mod

  

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

if (X+Y) % 3 != 0 or not (X <= 2*Y and Y <= 2*X):

    print((0))

    exit()



n = (X+Y) // 3

r = Y - n

#print(n, r)

print((combination(n, r)))
# nCrの左項には nn しか来ない場合、1!～(n-1)!は保持しなくてよいバージョン
def prepare(n, MOD):
    # n! の計算
    f = 1
    for m in range(1, n + 1):
        f *= m
        f %= MOD
    fn = f
    # n!^-1 の計算
    inv = pow(f, MOD - 2, MOD)
    # n!^-1 - 1!^-1 の計算
    invs = [1] * (n + 1)
    invs[n] = inv
    for m in range(n, 1, -1):
        inv *= m
        inv %= MOD
        invs[m - 1] = inv
    return fn, invs


MOD = 10**9 + 7
x, y = list(map(int, input().split()))
d, m = divmod(x + y, 3)
if m != 0 or x / y > 2 or y / x > 2:
    print((0))
    exit()
c = abs(d - x)
f, invs = prepare(d, MOD)
ans = f * invs[c] * invs[d - c] % MOD
print(ans)

# nCr mod m
# rがn/2に近いと非常に重くなる
def combination(n, r, mod=10**9 + 7):
    n1, r = n + 1, min(r, n - r)
    numer = denom = 1
    for i in range(1, r + 1):
        numer = numer * (n1 - i) % mod
        denom = denom * i % mod
    return numer * pow(denom, mod - 2, mod) % mod


X, Y = list(map(int, input().split()))
if (X + Y) % 3 != 0 or not (X <= 2 * Y and Y <= 2 * X):
    print((0))
    exit()
n = (X + Y) // 3
r = Y - n
# print(n, r)
print((combination(n, r)))

-# nCrの左項には nn しか来ない場合、1!～(n-1)!は保持しなくてよいバージョン -def prepare(n, MOD): -    # n! の計算 -    f = 1 -    for m in range(1, n + 1): -        f *= m -        f %= MOD -    fn = f -    # n!^-1 の計算 -    inv = pow(f, MOD - 2, MOD) -    # n!^-1 - 1!^-1 の計算 -    invs = [1] * (n + 1) -    invs[n] = inv -    for m in range(n, 1, -1): -        inv *= m -        inv %= MOD -        invs[m - 1] = inv -    return fn, invs +# nCr mod m +# rがn/2に近いと非常に重くなる +def combination(n, r, mod=10**9 + 7): +    n1, r = n + 1, min(r, n - r) +    numer = denom = 1 +    for i in range(1, r + 1): +        numer = numer * (n1 - i) % mod +        denom = denom * i % mod +    return numer * pow(denom, mod - 2, mod) % mod -MOD = 10**9 + 7 -x, y = list(map(int, input().split())) -d, m = divmod(x + y, 3) -if m != 0 or x / y > 2 or y / x > 2: +X, Y = list(map(int, input().split())) +if (X + Y) % 3 != 0 or not (X <= 2 * Y and Y <= 2 * X): -c = abs(d - x) -f, invs = prepare(d, MOD) -ans = f * invs[c] * invs[d - c] % MOD -print(ans) +n = (X + Y) // 3 +r = Y - n +# print(n, r) +print((combination(n, r)))