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 C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>

#define rep(i, a, b) for ( int i = (a); i < (b); i++ )
#define per(i, a, b) for ( int i = (b)-1; i >= (a); i--)
#define pb push_back
#define bg begin()
#define en end()
#define DEBUG_INT(var) printf("the value of "#var" is %d\n", var)
#define PRINT_ARRAY(name, i) printf("the value of "#name"[%d] is %d\n", (i), name[(i)])
#define DEBUG_ARRAY(name, begin, end) REP(i, begin, end) PRINT_ARRAY(name, i)

#define pr_arr(name, a, b) \
  for (int i = (a); i < (b); i++) { \
    for (int j = (a); j < (b); j++) {\
      if (j > (a)) printf(" "); \
      printf("%lld", name[i][j]); \
    }\
    printf("\n");\
  }\

#define YES puts("YES")
#define NO  puts("NO")
#define Yes puts("Yes")
#define No  puts("No")

using namespace std;

typedef long long ll;

static const int MAX = 1000005;
static const int MOD = 1000000007;

ll ans;
ll X, Y;

long long fac[MAX],   // i!    mod p iの階乗
          finv[MAX],  // i!^-1 mod p iの階乗の逆元
          inv[MAX];   // i^-1  mod p iの逆元 inverse

/* 
   逆元漸化式によるnCk mod pを求めるための前準備
　　n! mod p
   (k!)^-1 mod p
   を予め求めておく
   使用可能場面
   ・1 <= k <= n <= 10^7
   ・p が素数
   ・n < p
   pが素数でないとMOD%iで0になってしまう
   n < pでないとMOD%iで0になってしまう
*/
void comb_init() {
    fac[0] = fac[1] = 1;
    finv[0] = finv[1] = 1;
    inv[1] = 1;
    for (int i = 2; i < MAX; i++) {
        fac[i] = fac[i-1] * i % MOD;
        inv[i] = MOD - inv[MOD%i] * (MOD/i) % MOD;
        finv[i] = finv[i-1] * inv[i] % MOD;
    }
}
/*
    nCk = n! / ((k!)^-1 * ((n-k)!)^-1) であることを利用し、
    予め求めたn!と(k!)^-1 mod p からO(1)でnCk mod pを返す
*/

long long combination(long long n, long long k) {
    if (n < k) return 0;
    if (n < 0 || k < 0) return 0;
    return fac[n] * (finv[k] * finv[n-k] % MOD) % MOD;
}

int main(void) {
    scanf("%lld %lld", &X, &Y);
    comb_init();

    // 2m+ n = X 
    //  m+2n = Y
    // 3n = 2Y - X -> n = (2Y-X)/3
    //                m = (2X-Y)/3

    if ((X+Y)%3 != 0) {
        puts("0");
        return 0;
    }

    ll m = (2*X-Y)/3;
    ll n = (2*Y-X)/3;

    printf("%lld\n", combination(n+m, m));

	return 0;
}