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

#include <bits/stdc++.h>

using namespace std;

#define int long long
#define all(v) (v).begin(), (v).end()
#define resz(v, ...) (v).clear(), (v).resize(__VA_ARGS__)
#define reps(i, m, n) for(int i = (int)(m); i < (int)(n); i++)
#define rep(i, n) reps(i, 0, n)

template<class T1, class T2> void chmin(T1 &a, T2 b){if(a>b)a=b;}
template<class T1, class T2> void chmax(T1 &a, T2 b){if(a<b)a=b;}

using Pi = pair<int, int>;
using Tapris = tuple<int, int, int>;
using vint = vector<int>;

const int inf = 1LL << 55;
const int mod = 1e9 + 7;

struct Combinatorics {
  using int64 = long long;
  int64 mod;
  int64 fact[202020];
  int64 invfact[202020];
  Combinatorics(int64 mod):mod(mod) {
    fact[0] = invfact[0] = 1;
    for(int i = 1; i < 202020; ++i) {
      fact[i] = fact[i-1]*i%mod;
      invfact[i] = minv(fact[i]);
    }
  }
  int64 mpow(int64 x, int64 n) const {
    int64 res = 1;
    while(n > 0) {
      if(n&1) res = res*x%mod;
      x = x*x%mod;
      n >>= 1;
    }
    return res;
  }
  int64 minv(int64 x) const {
    return mpow(x, mod-2);
  }
  int64 mfact(int64 x) const {
    return fact[x];
  }
  int64 C(int64 n, int64 r) const {
    if(r < 0 || n < r) return 0;
    return fact[n]*invfact[r]%mod*invfact[n-r]%mod;
  }
  int64 P(int64 n, int64 r) const {
    if(r < 0 || n < r) return 0;
    return fact[n]*invfact[n-r]%mod;
  }
}C(mod);


signed main() {
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  cout << fixed << setprecision(12);

  int r, c, ay, ax, by, bx;
  cin >> r >> c >> ay >> ax >> by >> bx;

  int By[3][3], Bx[3][3];
  reps(i, -1, 2) reps(j, -1, 2) {
    By[i+1][j+1] = by+i*r;
    Bx[i+1][j+1] = bx+j*c;
  }

  int mod = 1e8+7;
  Combinatorics comb(mod);

  int mn = inf;
  rep(i, 3) rep(j, 3) {
    chmin(mn, llabs(ay-By[i][j])+llabs(ax-Bx[i][j]));
  }

  int ans = 0;
  rep(i, 3) rep(j, 3) {
    int d = llabs(ay-By[i][j])+llabs(ax-Bx[i][j]);
    if(mn == d) {
      ans += comb.C(mn, llabs(ay-By[i][j]));
      ans %= mod;
    }
  }
  cout << ans << endl;

  return 0;
}