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

import java.lang.Math.abs

fun main(args:Array<String>):Unit {
    val arg = readLine()!!.trim().split(' ').map(String::toInt)
    val (r, c) = arg.take(2)
    val (ax, ay, bx, by) = arg.drop(2)
    val mod = 100000007L
    val memoFactorial = LongArray(1001){-1}
    factorial(1000, mod, memoFactorial)
    val memoInverse = memoFactorial.map{power(it, mod - 2, mod)}.toLongArray()
    val combination:(Int, Int) -> Long = fun(n:Int, r:Int):Long{ return (((memoFactorial[n] * memoInverse[r]) % mod) * memoInverse[n - r]) % mod}
    val dx = abs(ax - bx)
    val dy = abs(ay - by)
    val diffX = minOf(dx, r - dx)
    val diffY = minOf(dy, c - dy)
    println((combination(diffX + diffY, diffX) * (if (dx * 2 == r) 2 else 1) * if (dy * 2 == c) 2 else 1) % mod)
}
fun factorial(n:Int, mod:Long, memo:LongArray):Long {
    if (memo[n] >= 0) return memo[n]
    memo[n] = when(n){
        0 -> 1
        else -> (n * factorial(n - 1, mod, memo)) % mod
    }
    return memo[n]
}
fun power(base:Long, exp:Long, mod:Long):Long {
    return when(exp){
        0L -> 1
        else -> (power(base, exp / 2, mod).let{if (exp % 2 == 0L) it * it else it * it} % mod * if (exp % 2 == 0L) 1 else base) % mod
    }
}