#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const LL N = 1e6+100,mod = 998244353;
LL f[N][2][2];
LL h,w,k;
LL x1,x2,y1,y2;
int main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>h>>w>>k;
cin>>x1>>y1>>x2>>y2;
f[0][x1==x2][y1==y2] = 1;
for(int i=1; i<=k; i++) {
f[i][0][0] = (1LL * f[i-1][1][0] * (h-1) + 1LL * f[i-1][0][1] * (w-1) + 1LL * f[i-1][0][0] * (h+w-4)) % mod;
f[i][0][1] = (1LL * f[i-1][0][0] + 1LL * f[i-1][1][1] * (h-1) + 1LL * f[i-1][0][1] * (h-2)) % mod;
f[i][1][0] = (1LL * f[i-1][0][0] + 1LL * f[i-1][1][1] * (w-1) + 1LL * f[i-1][1][0] * (w-2)) % mod;
f[i][1][1] = (1LL * f[i-1][1][0] + 1LL * f[i-1][0][1]) % mod;
}
cout << f[k][1][1] << endl;
return 0;
}
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int N = 20;
typedef long long ll;
ll a[N], b[N], f[1 << N];
ll x, y;
int n;
inline int calc(int S, int x) {//计算g(S,x)中S & (2的i次方)且 i < x的 i的个数
int ret = 0;
for (int i = 0; i < n; i++)
if ((S & (1 << i)) == 0 && i < x) ++ret;
return ret;
}
int main() {
cin >> n >> x >> y;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) cin >> b[i];
memset(f, 0x3f, sizeof f);
f[0] = 0;
int all = (1 << n) - 1;//初始化二进制表示下n位都是1,每一位都是1时,则匹配成功,即f[all]。
for (int S = 0; S <= all; S++) {//从没有一位匹配成功开始循环。
int cnt = 0;//cnt保存1的个数,即匹配成功的个数。
for (int i = 0; i < n; i++) if (S & (1 << i)) cnt++;//统计S的哪一位是1
for (int i = 0; i < n; i++) {
if (S & (1 << i)) continue;//如果这一位已经匹配成功了,则跳过。
//S & (1<<i)若为真,表示S的第i位是1
//S | (1<<i)若为真,表示S的第i位是0,是0表示这一位还没有匹配
f[S | (1 << i)] = min(f[S | (1 << i)], f[S] + x * abs(a[i + 1] - b[cnt + 1]) + y * calc(S, i));
//calc(S,i)表示a[i+1]与b[cnt+1]匹配成功的交换次数
/*
每次由上一次转化而来,f[S]即上一次的花费,现在匹配第cnt+1位,保持b数组不动,通过改变a数组来实现;
每次加减花费x,两数的大小之差即为此操作的次数;
大小相同后,进行操作2:
操作次数为i之前还没有匹配成功的个数。
*/
}
}
cout << f[all] << endl;
return 0;
}