def get_i() #空白区切の入力を数値(整数)の配列で返す
  return gets.chomp.split(" ").map(&:to_i)
end
def get_f() #空白区切の入力を数値(実数)の配列で返す
  return gets.chomp.split(" ").map(&:to_f)
end
def get() #空白区切の入力を文字列の配列で返す
  return gets.chomp.split(" ")
end
def get_nsp() #入力されたものを一文字ずつに区切った文字列の配列で返す
  return gets.chomp.split("")
end
def yn_judge(bool,y="Yes",n="No") #boolに真偽を投げることで、trueならy、falseならnの値を出力する
  return bool ? y : n 
end
def array(size,n=1,init=nil) #nに配列の次元数、sizeに配列の大きさ、initに初期値を投げることでその配列を返す
  if n==1
    return Array.new(size){init}
  else
    return Array.new(n).map{Array.new(size){init}}
  end
end

def inverse(x)
  p=1
  b=x
  mod=10**9+7
  (mod-2).to_s(2).reverse.split("").each do|i|
    p=(p*b)%mod if i=="1"
    b=(b*b)%mod
  end
  return p
end
def p(a,b)
  mod=10**9+7
  return (a..b).inject(1){|x,y| (x*y)%mod}
end
def C(n,r)
  mod=10**9+7
  return (p(r+1,n)*inverse(p(1,n-r)%mod))%mod
end

x,y=get_i
if ((x+y)%3).zero?
  n=((1.0/3.0).to_f*(2*y-x)).to_i
  m=((1.0/3.0).to_f*(2*x-y)).to_i
  if n<0 or m<0
    puts 0
  else
    puts C(n+m,n)% (10**9+7)
  end
else
  puts 0
end