https://atcoder.jp/contests/abc232/tasks/abc232_e
まず縦の移動のみの場合の数を数えます。なぜなら、縦の移動回数をkとすれば、縦と横の移動が決まれば、それらの場合の数の積にを掛けたものになるからです。
1回の移動による場合の数は、のときは0です。のときは1です。どうやら、のときとのときは別で考えなければならないようです。
そこで、k回移動でのときの場合の数を、のときの場合の数をと書くことにします。そうすると、
です。また、
です。漸化式を考えましょう。を考えると、の状態からの状態に遷移できないので、だけ考えます。H-1通りのから遷移できるので、
となります。の場合は、
aの項を消すと、
となります。の係数が違うだけなので、縦の場合の数を、横の場合の数をと表すと、求める場合の数は、
となります。
# coding: utf-8 # Rook Path from itertools import * import sys sys.setrecursionlimit(2*10**5) #################### library #################### def read_tuple(): return tuple(map(int, raw_input().split())) # ax = by + c def linear_diophantine(a, b, c): def f(a, b, c): if a == 1: return (b + c, 1) elif a == -1: return (-b - c, 1) d = b / a r = b % a t = f(r, a, -c) return (t[1] + d * t[0], t[0]) return f(a, b, c) def inverse(n, p): x, y = linear_diophantine(n, p, 1) return x #################### process #################### def read_input(): H, W, K = read_tuple() x1, y1, x2, y2 = read_tuple() return (H, W, K, x1, y1, x2, y2) def F(H, W, K, x1, y1, x2, y2): p = H - 1 if x1 == x2 else -1 q = W - 1 if y1 == y2 else -1 return (pow(H+W-2, K, D) + q * pow(H-2, K, D) + p * pow(W-2, K, D) + p * q * pow(-2, K, D)) * inverse(H*W, D) % D #################### main #################### D = 998244353 H, W, K, x1, y1, x2, y2 = read_input() print F(H, W, K, x1, y1, x2, y2)