Problem:
Problem B : Grid

r × c の2次元グリッド上の２つの座標 (a1,a2) と (b1,b2) が与えられる。
あるマス (e,f) から (e+1,f)、(e-1,f)、(e,f+1)、(e,f-1) のどれかのマスに移動するコストを１とする。
また、(e,c-1) と (e,0)、(r-1,f) と (0,f) の間もコスト１で移動することができる。
この時に１つ目の座標から２つ目の座標へ最短コストで移動できる経路の数を求めよ。

Input

入力は以下のフォーマットで与えられる。

r c a1 a2 b1 b2

入力は以下の制約を満たす

1 ≤ r , c ≤ 1,000

0 ≤ a1 , b1 < r

0 ≤ a2 , b2 < c

Output

答えの値を100,000,007で割った余りを出力せよ。

Sample Input 1

4 4 0 0 3 3

Sample Output 1

2

Sample Input 2

4 4 0 0 1 1

Sample Output 2

2

Sample Input 3

2 3 0 0 1 2

Sample Output 3

4

Sample Input 4

500 500 0 0 200 200

Sample Output 4

34807775

Solution in C# (judge verdict: Wrong Answer)

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



namespace Test1 {

    class ClassMain {

        public static void Main(String[] args) {
            string line;
            while ((line = Console.ReadLine()) != null) {
                string[] strs = line.Split(' ');
                int r = int.Parse(strs[0]), c = int.Parse(strs[1]);
                int a1 = int.Parse(strs[2]), a2 = int.Parse(strs[3]);
                int b1 = int.Parse(strs[4]), b2 = int.Parse(strs[5]);

                int xD = b1 - a1;
                if (xD < 0) { xD *= -1; }
                if (xD > r / 2) { xD = r - xD; }
                int yD = b2 - a2;
                if (yD < 0) { yD *= -1; }
                if (yD > c / 2) { yD = c - yD; }

                long kihon = combi(xD + yD, xD);
                kihon %= 100000007;
                if (xD == r  - xD) { kihon *= 2; }
                if (yD == c  - yD) { kihon *= 2; }
                kihon %= 100000007;
                Console.WriteLine(kihon);
            
            }      
        }

        //combination. pick x elements out of n elements.
        public static long combi(int n, int x) {
            if (n == 0) { return 1; }
            if (x == 0) { return 1; }
            if (x > n / 2) { x = n - x; }
            long combi = 1;
            for (int i = 1; i <= x; i++) { combi = combi * ( n - x + i) / i; }
            return combi;

        }

        

    }

}