#include #include #include #include #include // ナイーブな行列累乗解 (盤面が広すぎるのでTLE) // Complexity: O((HW)^3 logT), H = (2^^X) - 1, W = (2^^Y) - 1 template struct ModInt { using lint = long long; int val; constexpr ModInt() : val(0) {} constexpr ModInt &_setval(lint v) { val = (v >= mod ? v - mod : v); return *this; } constexpr ModInt(lint v) { _setval(v % mod + mod); } explicit operator bool() const { return val != 0; } constexpr ModInt operator+(const ModInt &x) const { return ModInt()._setval((lint)val + x.val); } constexpr ModInt operator-(const ModInt &x) const { return ModInt()._setval((lint)val - x.val + mod); } constexpr ModInt operator*(const ModInt &x) const { return ModInt()._setval((lint)val * x.val % mod); } constexpr ModInt operator-() const { return ModInt()._setval(mod - val); } constexpr ModInt &operator+=(const ModInt &x) { return *this = *this + x; } constexpr ModInt &operator-=(const ModInt &x) { return *this = *this - x; } constexpr ModInt &operator*=(const ModInt &x) { return *this = *this * x; } friend constexpr ModInt operator+(lint a, const ModInt &x) { return ModInt()._setval(a % mod + x.val); } friend constexpr ModInt operator-(lint a, const ModInt &x) { return ModInt()._setval(a % mod - x.val + mod); } friend constexpr ModInt operator*(lint a, const ModInt &x) { return ModInt()._setval(a % mod * x.val % mod); } }; template struct matrix { int H, W; std::vector elem; typename std::vector::iterator operator[](int i) { return elem.begin() + i * W; } inline T &at(int i, int j) { return elem[i * W + j]; } inline T get(int i, int j) const { return elem[i * W + j]; } operator std::vector>() const { std::vector> ret(H); for (int i = 0; i < H; i++) std::copy(elem.begin() + i * W, elem.begin() + (i + 1) * W, std::back_inserter(ret[i])); return ret; } matrix() = default; matrix(int H, int W) : H(H), W(W), elem(H * W) {} matrix operator*(const matrix &r) const { matrix ret(H, r.W); for (int i = 0; i < H; i++) { for (int k = 0; k < W; k++) { for (int j = 0; j < r.W; j++) { ret.at(i, j) += this->get(i, k) * r.get(k, j); } } } return ret; } matrix &operator*=(const matrix &r) { return *this = *this * r; } friend std::vector operator*(const matrix &m, const std::vector &v) { assert(m.W == int(v.size())); std::vector ret(m.H); for (int i = 0; i < m.H; i++) { for (int j = 0; j < m.W; j++) { ret[i] += m.get(i, j) * v[j]; } } return ret; } }; using mint = ModInt<998244353>; using namespace std; array dx{1, -1, 0, 0}; array dy{0, 0, 1, -1}; int main() { int X, Y; long long T; int a, b, c, d; cin >> X >> Y >> T >> a >> b >> c >> d; int H = (1 << X) - 1, W = (1 << Y) - 1; auto hw2id = [&](int h, int w) -> int { if (h < 0 or h >= H or w < 0 or w >= W) return -1; else return h * W + w; }; matrix trans(H * W, H * W); for (int i = 0; i < H; i++) { for (int j = 0; j < W; j++) { int from = hw2id(i, j); trans[from][from] = 1; for (int d = 0; d < 4; d++) { int to = hw2id(i + dx[d], j + dy[d]); if (to != -1) trans[to][from] = 1; } } } vector dp(H * W); dp[hw2id(a - 1, b - 1)] = 1; while (T) { if (T & 1) dp = trans * dp; trans *= trans; T >>= 1; } cout << dp[hw2id(c - 1, d - 1)].val << '\n'; }