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

#include <iostream>
#include <algorithm>
#include <vector>
#include <utility>
#include <cmath>
#include <queue>
typedef long long ll;
using namespace std;
const int mod=1e9+7;
const ll inf=(1e14);

int extended_euclidean(int a,int b,ll &x,ll &y){
	if(!b){
		x=1;y=0;
		return a;
	}
	ll x1,y1;
	int g=extended_euclidean(b,a%b,x1,y1);
	x = y1;
	y = x1 - y1*(a/b);
	return g;
}

ll c(ll n,ll r){
	ll nf=1;
	for(ll i=2;i<=n;i++) nf=(nf*i)%mod;
	ll rf=1,nrf=1;
	for(ll i=2;i<=r;i++) rf=(rf*i)%mod;
	for(ll i=2;i<=n-r;i++) nrf=(nrf*i)%mod;
	ll rfi,nrfi,t;
	extended_euclidean(mod,rf,t,rfi);
	extended_euclidean(mod,nrf,t,nrfi);
	rfi%=mod;nrfi%=mod;
	rfi=(rfi+mod)%mod;
	nrfi=(nrfi+mod)%mod;
	return (((nf*rfi)%mod)*nrfi)%mod;
}

ll solve(){
	int x,y;
	cin>>x>>y;
	int a = (2*x-y)/3, b = (2*y-x)/3;
	if( (a<0) || (b<0) || (2*a+b != x) || (2*b+a != y) ) return 0;
	return c(a+b,a);
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
#endif
    int t=1;
    //cin>>t;
    while(t--) cout<<solve()<<'\n';
    //while(t--) solve(),cout<<'\n';
    return 0;
}