Problem:
Problem D: Gridgedge

Problem

左上が$(0, 0)$、 右下が$(R-1, C-1)$である$R \times C$マスのグリッドがある。あるマス($e$, $f$)にいるとき、そこから$(e+1, f)$, $(e-1, f)$, $(e, f+1)$, $(e, f-1)$, $(e, 0)$, $(e, C-1)$, $(0, f)$, $(R-1, f)$にはコスト$1$で移動できる。ただしグリッドの外に出ることはできない。マス$(a_i, a_j)$から$(b_i, b_j)$へ移動するとき、最短経路のコストと、最短経路の組み合わせの総数を$10^9 + 7$で割った余りを計算せよ。

ただし、経路の組み合わせは移動の方法によって区別するものとする。たとえば、現在地が$(100, 1)$ のとき、 $(100, 0)$に最短コストで行くには上記$(e, f-1)$か$(e, 0)$で行くことができるので、$2$通りと数える。

Input

入力は以下の形式で与えられる。

$R$ $C$ $a_i$ $a_j$ $b_i$ $b_j$

Constraints

入力は以下の条件を満たす。

$1 \le R, C \le 500$

$0 \le a_i, b_i \le R - 1$

$0 \le a_j, b_j \le C - 1$

与えられる入力は全て整数である。

Output

マス$(a_i, a_j)$から$(b_i, b_j)$へ移動するとき、最短経路のコストと、最短経路の組み合わせの総数を$10^9+7$で割った余りを空白区切りで$1$行に出力せよ。

Sample Input 1

2 2 0 0 1 1

Sample Output 1

2 8

Sample Input 2

1 1 0 0 0 0

Sample Output 2

0 1

Sample Input 3

1 10 0 0 0 9

Sample Output 3

1 1

Sample Input 4

5 5 0 0 4 4

Sample Output 4

2 2

Sample Input 5

421 435 196 169 388 9

Sample Output 5

43 917334776

Solution in C++14 (judge verdict: Accepted)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1000000007;

int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};

int main() {
  int h, w, ai, aj, bi, bj;
  cin >> h >> w >> ai >> aj >> bi >> bj;

  vector<vector<pair<ll, ll>>> r(h, vector<pair<ll, ll>>(w, {1e9, 0}));

  queue<pair<int, int>> q;
  q.push({ai, aj});
  r[ai][aj] = {0, 1};
  while (!q.empty()) {
    auto p = q.front();
    q.pop();

    vector<pair<int, int>> next;
    for (int i = 0; i < 4; i++) {
      next.push_back({p.first + dy[i], p.second + dx[i]});
    }
    next.push_back({p.first, 0});
    next.push_back({p.first, w - 1});
    next.push_back({0, p.second});
    next.push_back({h - 1, p.second});

    for (auto e : next) {
      if (e == p || e.first < 0 || h <= e.first || e.second < 0 || w <= e.second) {
        continue;
      }

      if (r[p.first][p.second].first + 1 == r[e.first][e.second].first) {
        r[e.first][e.second].second += r[p.first][p.second].second;
        r[e.first][e.second].second %= mod;
      } else if (r[p.first][p.second].first + 1 < r[e.first][e.second].first) {
        r[e.first][e.second].first = r[p.first][p.second].first + 1;
        r[e.first][e.second].second = r[p.first][p.second].second;
        q.push(e);
      }
    }
  }

  // for (auto ee : r) {
  //   for (auto e : ee) {
  //     cerr << e.first << "," << e.second << " ";
  //   }
  //   cerr << endl;
  // }

  cout << r[bi][bj].first << " " << r[bi][bj].second << endl;
}