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

if ((x%3)+(y%3))%3!=0:

	print((0))

else:

	n=int((x+y)/3)

	r=y-n

	if r<0 or r>n:

		print((0))

	else:

		if r>n-r:

			r=n-r

		mod=1000000007

		kaijo=[1]

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

			kaijo.append(kaijo[-1]*i%mod) #これで、kaijo[i]=i!となる。

		gyakugen=[pow(kaijo[n-r],mod-2,mod)]

		for i in reversed(list(range(1,n-r+1))):

			gyakugen.append(gyakugen[-1]*i%mod) #これで、gyakugen[i]=n-r-iの逆元となる

		kotae=kaijo[n]*gyakugen[0]*gyakugen[n-2*r]%mod



		print(kotae)
[x,y]=list(map(int,input().split()))



#nCrのmodを求める

def nCrmod(n,r,mod):

	if r<0 or r>n:

		ans=0

	else:

		if r>n-r:

			r=n-r

		kaijo=[1] #階乗リスト作成

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

			kaijo.append(kaijo[-1]*i%mod) #これで、kaijo[i]≡i!となる。

		gyakugen=[pow(kaijo[n-r],mod-2,mod)] #逆限リスト作成

		for i in reversed(list(range(1,n-r+1))):

			gyakugen.append(gyakugen[-1]*i%mod) #これで、gyakugen[i]=n-r-iの逆元 となる。

		ans=kaijo[n]*gyakugen[0]*gyakugen[n-2*r]%mod

	return(ans)





if ((x%3)+(y%3))%3!=0:

	print((0))

else:

	n=int((x+y)/3)

	r=y-n

	mod=1000000007

	print((nCrmod(n,r,mod)))
[x, y] = list(map(int, input().split()))
if ((x % 3) + (y % 3)) % 3 != 0:
    print((0))
else:
    n = int((x + y) / 3)
    r = y - n
    if r < 0 or r > n:
        print((0))
    else:
        if r > n - r:
            r = n - r
        mod = 1000000007
        kaijo = [1]
        for i in range(1, n + 1):
            kaijo.append(kaijo[-1] * i % mod)  # これで、kaijo[i]=i!となる。
        gyakugen = [pow(kaijo[n - r], mod - 2, mod)]
        for i in reversed(list(range(1, n - r + 1))):
            gyakugen.append(gyakugen[-1] * i % mod)  # これで、gyakugen[i]=n-r-iの逆元となる
        kotae = kaijo[n] * gyakugen[0] * gyakugen[n - 2 * r] % mod
        print(kotae)

[x, y] = list(map(int, input().split()))
# nCrのmodを求める
def nCrmod(n, r, mod):
    if r < 0 or r > n:
        ans = 0
    else:
        if r > n - r:
            r = n - r
        kaijo = [1]  # 階乗リスト作成
        for i in range(1, n + 1):
            kaijo.append(kaijo[-1] * i % mod)  # これで、kaijo[i]≡i!となる。
        gyakugen = [pow(kaijo[n - r], mod - 2, mod)]  # 逆限リスト作成
        for i in reversed(list(range(1, n - r + 1))):
            gyakugen.append(gyakugen[-1] * i % mod)  # これで、gyakugen[i]=n-r-iの逆元 となる。
        ans = kaijo[n] * gyakugen[0] * gyakugen[n - 2 * r] % mod
    return ans


if ((x % 3) + (y % 3)) % 3 != 0:
    print((0))
else:
    n = int((x + y) / 3)
    r = y - n
    mod = 1000000007
    print((nCrmod(n, r, mod)))

+# nCrのmodを求める +def nCrmod(n, r, mod): +    if r < 0 or r > n: +        ans = 0 +    else: +        if r > n - r: +            r = n - r +        kaijo = [1]  # 階乗リスト作成 +        for i in range(1, n + 1): +            kaijo.append(kaijo[-1] * i % mod)  # これで、kaijo[i]≡i!となる。 +        gyakugen = [pow(kaijo[n - r], mod - 2, mod)]  # 逆限リスト作成 +        for i in reversed(list(range(1, n - r + 1))): +            gyakugen.append(gyakugen[-1] * i % mod)  # これで、gyakugen[i]=n-r-iの逆元 となる。 +        ans = kaijo[n] * gyakugen[0] * gyakugen[n - 2 * r] % mod +    return ans + + -    if r < 0 or r > n: -        print((0)) -    else: -        if r > n - r: -            r = n - r -        mod = 1000000007 -        kaijo = [1] -        for i in range(1, n + 1): -            kaijo.append(kaijo[-1] * i % mod)  # これで、kaijo[i]=i!となる。 -        gyakugen = [pow(kaijo[n - r], mod - 2, mod)] -        for i in reversed(list(range(1, n - r + 1))): -            gyakugen.append(gyakugen[-1] * i % mod)  # これで、gyakugen[i]=n-r-iの逆元となる -        kotae = kaijo[n] * gyakugen[0] * gyakugen[n - 2 * r] % mod -        print(kotae) +    mod = 1000000007 +    print((nCrmod(n, r, mod)))