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 <string>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include<math.h>
#include<string.h>
#include<queue>

using namespace std;

#define M  100000+100
#define mod 1000000007
typedef long long ll;

int a[M];
ll kpow(ll x,ll n) {
    ll res = 1;
    x%=mod;
    while (n) {
        if(n&1) res = res*x%mod;
        x = x*x %mod;
        n >>=1;
    }
    return res;
}

ll C(ll n,ll m) {
    if(n < m) return 0;
    // c(n,m) = n!/m!/(n-m)!
    ll res = 1;
    for(int i=1; i<=m; i++) {
        ll a = (n+i-m)%mod;
        ll b = i%mod;
        res = res*(a*kpow(b,mod-2)%mod)%mod;
    }
    return res;
}

ll Lucas(ll n,ll m) {
    if(m == 0) return 1;
    return C(n%mod, m%mod) * Lucas(n/mod,m/mod)%mod;
}
int main()
{
    int x,y;
    cin>>x>>y;
    //cout<<Lucas(x,y);
    if(x==y)
    {
        if(x%3!=0)
            cout<<"0";
        else
        {
            ll t=x/3;
            cout<<Lucas(t*2,t);
        }
    }
    else
    {
        int maxx=max(x,y),minn=min(x,y);
        int dif=maxx-minn;
        maxx=maxx-2*dif;
        minn=minn-dif;
        if(maxx<0||minn<0)
           cout<<"0";
        else
        {
            if(maxx%3!=0) cout<<"0";
            else
            {
                ll t=dif+maxx/3*2;
                cout<<Lucas(t,maxx/3);
            }
        }
    }
    return 0;
}