Problem:
Score : 400 points

Problem Statement

There is a knight - the chess piece - at the origin (0, 0) of a two-dimensional grid.

When the knight is at the square (i, j), it can be moved to either (i+1,j+2) or (i+2, j+1).

In how many ways can the knight reach the square (X, Y)?

Find the number of ways modulo 10^9 + 7.

Constraints

1 \leq X \leq 10^6

1 \leq Y \leq 10^6

All values in input are integers.

Input

Input is given from Standard Input in the following format:

X Y

Output

Print the number of ways for the knight to reach (X, Y) from (0, 0), modulo 10^9 + 7.

Sample Input 1

3 3

Sample Output 1

2

There are two ways: (0,0) \to (1,2) \to (3,3) and (0,0) \to (2,1) \to (3,3).

Sample Input 2

2 2

Sample Output 2

0

The knight cannot reach (2,2).

Sample Input 3

999999 999999

Sample Output 3

151840682

Print the number of ways modulo 10^9 + 7.

Solution in Rust (1.42.0) (judge verdict: Runtime Error)

use proconio::input;
use std::collections::HashMap;

const MOD: i64 = 1_000_000_007;

struct Helper {
  memo: HashMap<i64, i64>
}

impl Helper {
  pub fn get_val(&mut self, a: i64, b:i64) -> i64 {
    let c = self.get_pn(a + b);
    let p = self.get_pn(a) % MOD * self.get_pn(b) % MOD;
    c * modinv(p, MOD) % MOD
  }
  
  pub fn get_pn(&mut self, v: i64) -> i64 {
    if v == 1 {
      return 1
    }
    
    if let Some(v) = self.memo.get(&v) {
      *v
    } else {
      let new_val = v * self.get_pn(v - 1) % MOD;
      self.memo.insert(v, new_val);
      new_val
    }
  }
}

fn swap(a: i64, b: i64) -> (i64, i64) {
  (b, a)
}

fn modinv(
  mut a: i64,
  m: i64
) -> i64 {
    let mut b = m;
    let mut u = 1;
    let mut v = 0;
    while 0 < b {
      let t = a / b;
      a -= t * b;
      let s = swap(a, b);
      a = s.0;
      b = s.1;
      u -= t * v;
      let s = swap(u, v);
      u = s.0;
      v = s.1;
    }
    u %= m; 
    if u < 0 {
      u += m;
    }
    u
}

fn main() {
  input! {
    x: i64,
    y: i64,
  }
  
  let a = 2 * x - y;
  if a % 3 != 0 {
    println!("0");
    return
  }
  let a = a / 3;
  let b =  x - (2 * a);
  
  if a < 0 || b < 0 {
    println!("0");
    return
  }
  
  let mut helper = Helper { memo: HashMap::new() };
  
  println!("{}", helper.get_val(a, b));
}