#include #include using namespace std; using ll = long long; #define rep(i, n) for (int i = 0; i < (int)(n); i++) using mint = atcoder::modint998244353; vector> mat_mul(vector> a, vector> b) { int n = a.size(); vector ans(n, vector(n, 0)); for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) for (int k = 0; k < n; k++) { ans[i][j] += a[i][k] * b[k][j]; } return ans; } vector> mat_pow(vector> a, ll b) { int n = a.size(); vector ans(n, vector(n, 0)); for (int i = 0; i < n; i++) ans[i][i] = 1; while (b) { if (b % 2) ans = mat_mul(ans, a); a = mat_mul(a, a); b /= 2; } return ans; } int main() { cin.tie(nullptr); ios_base::sync_with_stdio(false); int h, w, sx, sy, gx, gy; ll k; cin >> h >> w; cin >> sx >> sy; cin >> gx >> gy; cin >> k; int m = h * w; auto tr = [&](int i, int j) { return i * w + j; }; sx--; sy--; gx--; gy--; int s = tr(sx, sy); int t = tr(gx, gy); vector> g(m); rep(i, h) rep(j, w) rep(x, h) rep(y, w) { if (i == x && j == y) continue; if (i == x || j == y || abs(i - x) == abs(j - y)) { g[tr(i, j)].push_back(tr(x, y)); } } vector> mat; vector>> z; rep(x, m) { vector> dp(1 << m, vector(m, 0)); dp[0][x] = 1; rep(i, 1 << m) rep(j, m) { for (int k : g[j]) { if (i >> k & 1) continue; dp[i ^ (1 << k)][k] += dp[i][j]; } } z.push_back(dp); vector v; rep(i, m) v.push_back(dp.back()[i]); mat.push_back(v); } // rep(i, m) { // rep(j, m) { // cout << mat[i][j].val() << " "; // } // cout << endl; // } mat = mat_pow(mat, k / m); // rep(i, m) { // rep(j, m) { // cout << mat[i][j].val() << " "; // } // cout << endl; // } k %= m; mint ans = 0; rep(i, m) { rep(j, 1 << m) { if (__builtin_popcount(j) == k) { ans += mat[s][i] * z[i][j][t]; } } } cout << ans.val() << endl; return 0; }