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# (.NET Core 3.1.201) (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ABC145D
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] XY = Console.ReadLine().Split(' ');
            long X = long.Parse(XY[0]);
            long Y = long.Parse(XY[1]);
            long ans = 1;
            if (Y < 2 * X && 2 * Y > X)
            {
                if ((X + Y) % 3 == 0)
                {
                    long N = (X + Y) / 3;
                    long x = 0;
                    long y = 0;
                    for(long i = 0; i <= N; i++)
                    {
                        if ((2 * i + (N - i)) == X && (i + 2 * (N - i)) == Y)
                        {
                            x = i;
                            y = N - i;
                        }
                    }
                    //Console.WriteLine(x);
                    //Console.WriteLine(y);
                    if (x > y)
                    {
                        long temp = x;
                        x = y;
                        y = temp;
                    }
                    List<long> gyakugen = new List<long>();
                    long mod = 1000000007;
                    string smod = Convert.ToString(mod - 2, 2);
                    int l = smod.Length;
                    for (long i = 1; i <= x; i++)
                    {
                        long p = i;
                        long g = 1;
                        for(int j = l-1 ; j >= 0; j--)
                        {
                            if (smod[j].ToString() == "1")
                            {
                                g *= p;
                            }
                            p *= p;
                            p %= mod;
                            g %= mod;
                            //Console.WriteLine(p);
                        }
                        gyakugen.Add(g);
                    }
                    long m = x + y;
                    for(long i = m; i > m-x; i--)
                    {
                        ans *= i;
                        ans %= mod;
                    }
                    //Console.WriteLine(smod);
                    //Console.WriteLine(gyakugen[1]);
                    int L = gyakugen.Count;
                    for(int i = 0; i < L; i++)
                    {
                        ans *= gyakugen[i];
                        ans %= mod;
                    }
                    Console.WriteLine(ans);
                }
                else Console.WriteLine(0);
            }
            else Console.WriteLine(0);
        }
    }
}