#nullable enable #region var (_input, _iter) = (Array.Empty(), 0); T I() where T : IParsable { while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Trim().Split(' '), 0); return T.Parse(_input[_iter++], null); } #endregion const int Mod = 998244353; static bool R(int x1, int y1, int x2, int y2) { if (x1 == x2 || y1 == y2) return true; if (x1 - y1 == x2 - y2) return true; if (x1 + y1 == x2 + y2) return true; return false; } var h = I(); var w = I(); (int, int) D(int z) => int.DivRem(z, w); int E(int x, int y) => x * w + y; var s = E(I() - 1, I() - 1); var g = E(I() - 1, I() - 1); var k = I(); var m = h * w; var b = m.ToFlag(); var gaz = new long[m, m]; { var az = new long[m, b, m]; for (var o = 0; o < m; o++) { az[o, 0, o] = 1; for (var i = 0; i < b; i++) for (var j = 0; j < m; j++) { var (sx, sy) = D(j); for (var t = 0; t < m; t++) { if (j == t || i.OfFlag(t)) continue; var (tx, ty) = D(t); if (!R(sx, sy, tx, ty)) continue; az[o, i.WithFlag(t, true), t] += az[o, i, j]; } } } for (var i = 0; i < m; i++) for (var j = 0; j < m; j++) gaz[i, j] = az[i, b - 1, j] % Mod; } var (kp, kq) = long.DivRem(k, m); var mns = new long[b, m]; mns[0, s] = 1; while (kp > 0) { if (kp % 2 != 0) { var nmns0 = new long[m]; for (var i = 0; i < m; i++) for (var j = 0; j < m; j++) { nmns0[j] = (nmns0[j] + mns[0, i] * gaz[i, j]) % Mod; } for (var i = 0; i < m; i++) mns[0, i] = nmns0[i]; } var ngaz = new long[m, m]; for (var i = 0; i < m; i++) for (var t = 0; t < m; t++) for (var j = 0; j < m; j++) { ngaz[i, j] = (ngaz[i, j] + gaz[i, t] * gaz[t, j]) % Mod; } gaz = ngaz; kp >>= 1; } for (var lp = 0; lp < kq; lp++) { var nmns = new long[b, m]; for (var i = 0; i < b; i++) for (var j = 0; j < m; j++) { if (mns[i, j] == 0) continue; var (sx, sy) = D(j); for (var t = 0; t < m; t++) { if (j == t || i.OfFlag(t)) continue; var (tx, ty) = D(t); if (!R(sx, sy, tx, ty)) continue; nmns[i.WithFlag(t, true), t] += mns[i, j]; } } for (var i = 0; i < b; i++) for (var j = 0; j < m; j++) nmns[i, j] %= Mod; mns = nmns; } var ans = 0L; for (var i = 0; i < b; i++) ans += mns[i, g]; ans %= Mod; Console.WriteLine(ans); static class BitExtensions { public static int ToFlag(this int i) { if (i < 0 || 31 <= i) throw new IndexOutOfRangeException(); return 1 << i; } public static bool OfFlag(this int value, int i) => (value & ToFlag(i)) > 0; public static int WithFlag(this int value, int i, bool f) => f ? (value | ToFlag(i)) : (value & ~ToFlag(i)); }