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<bits/stdc++.h>
 
#define rep(i,n) for(ll i = 0;i < n;++i)
using namespace std;
using ll = long long;
 
const ll M = 1e9+7;// 10^9+7

ll mpow(ll x,ll y){// x^y(mod M)を計算
    ll ans = 1;
    while(y != 0){
        if(y&1){
            ans = ans * x % M;
        }
        x = x * x % M;
        y = y >> 1;
    }
    return ans % M;
}

ll comb(ll n,ll k){// nCk(mod 10^9+7)を計算 : nCk = n! * (k!)^(M-2) * ((n-k)!)^(M-2) (mod M)を使っている
    ll a=1,b=1,c=1;
    if(n == 0 && k == 0) return 1;
    if(n < k|| n < 0) return 0;
    for(ll i = 1;i <= n;++i){// n!を計算
        a = a * i % M;
    }
    for(ll i = 1;i <= k;++i){// k!を計算
        b = b * i % M;
    }
    for(ll i = 1;i <= (n-k);++i){// (n-k)!を計算
        c = c * i % M;
    }
    b = mpow(b,M-2);// (k!)^(M-2)を計算
    c = mpow(c,M-2);// ((n-k)!)^(M-2)を計算
    return (a * b) % M * c % M;
}


int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    ll x, y;
    cin >> x >> y;
    ll n = (x+y) / 3;
    if((x+y)%3 != 0){ //合計が3の倍数ではなかったら0
        cout << 0 << endl;
        return 0;
    }
    x -= n;
    y -= n;
    if(x < 0 || y < 0) { 
        cout << 0 << endl;
        return 0;
    }
    ll ans = comb(x+y,y)%M;
    cout << ans << endl;

    cout << endl;
    return 0;
}