#include #include #include using namespace std; using namespace atcoder; using ll = long long; using mint = modint998244353; vector> m_mul(vector> &a, vector> &b) { ll n = a.size(); vector> ret(n, vector(n, mint(0))); for (ll i = 0; i < n; i++) { for (ll j = 0; j < n; j++) { for (ll k = 0; k < n; k++) { ret[i][j] = (ret[i][j] + a[i][k] * b[k][j]); } } } return ret; } vector> p_mul(vector> a, ll k) { ll n = a.size(); vector> ret(n, vector(n, mint(0))); for (ll i = 0; i < n; i++) { ret[i][i] = mint(1); } while (k > 0) { if (k % 2 == 1) { ret = m_mul(a, ret); } a = m_mul(a, a); k /= 2; } return ret; } int main(){ ll H, W, sx, sy, gx, gy, K; cin >> H >> W >> sx >> sy >> gx >> gy >> K; sx--; sy--; gx--; gy--; vector> mat(H * W, vector(H * W, 0)); for (ll i = 0; i < H; i++){ for (ll j = 0; j < W; j++){ for (ll k = 0; k < H; k++){ for (ll l = 0; l < W; l++){ if (i == k && j == l) continue; if (i == k || j == l || i + j == k + l || i - j == k - l){ mat[i * W + j][k * W + l] = 1; } } } } } vector> cnts_all(H * W, vector(H * W, mint(0))); vector>> cnts_part(H * W, vector>(H * W, vector(H * W + 1, mint(0)))); for (ll i = 0; i < H * W; i++){ vector> bitdp(1 << (H * W), vector(H * W, mint(0))); bitdp[0][i] = mint(1); for (ll j = 0; j < (1 << (H * W)); j++){ for (ll k = 0; k < H * W; k++){ for (ll l = 0; l < H * W; l++){ if ((j >> l) & 1) continue; if (mat[k][l] == 0) continue; bitdp[j + (1 << l)][l] += bitdp[j][k]; } } } for (ll j = 0; j < H * W; j++){ cnts_all[i][j] = bitdp[(1 << (H * W)) - 1][j]; } for (ll j = 0; j < (1 << (H * W)); j++){ ll popcnt = 0; for (ll k = 0; k < H * W; k++){ if ((j >> k) & 1) popcnt++; } for (ll k = 0; k < H * W; k++){ cnts_part[i][k][popcnt] += bitdp[j][k]; } } } ll div = K / (H * W); ll rem = K % (H * W); vector> mat_pow = p_mul(cnts_all, div); mint ans = mint(0); // (div * (H * W)) 回後の経由地を全探索する for (ll i = 0; i < H * W; i++){ ans += mat_pow[sx * W + sy][i] * cnts_part[i][gx * W + gy][rem]; } cout << ans.val() << endl; }