#include <bits/stdc++.h>
#define modd 998244353
using namespace std;
char a[1010][1010];
int x[1010][1010], y[1010][1010], ansc, ansf, sumc[1010][1010], sumf[1010][1010];
int t, id, n, m, c, f, vc, vf;
int main() {
ios::sync_with_stdio(0);
cin >> t >> id;
while (t--) {
cin >> n >> m >> c >> f;
memset(a, ' ', sizeof(a));
memset(x, 0, sizeof(x));
memset(y, 0, sizeof(y));
memset(sumc, 0, sizeof(sumc));
memset(sumf, 0, sizeof(sumf));
ansc = 0, ansf = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> a[i][j];
for (int i = 1; i <= n; i++)
for (int j = m - 1; j >= 1; j--)
if (a[i][j] == '0' && a[i][j + 1] == '0')
x[i][j] = x[i][j + 1] + 1; //计算每一个合法的点向右一共能形成的线段数
for (int j = 1; j <= m; j++)
for (int i = n - 1; i >= 1; i--)
if (a[i][j] == '0' && a[i + 1][j] == '0')
y[i][j] = y[i + 1][j] + 1; //计算向下一共能形成的线段数
for (int j = 1; j <= m; j++) { //枚举列数,以计算sumc(i,j)数量
for (int i = n; i >= 1; i--)
if (a[i][j] == '0')
sumc[i][j] = sumc[i + 1][j] + x[i][j] * 1ll % modd, sumf[i][j] = sumf[i + 1][j] + x[i][j] * y[i][j] * 1ll % modd;
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) { //枚举每一个格子
if (a[i][j] == '0' && a[i][j + 1] == '0' && a[i + 1][j] == '0' && a[i + 2][j] == '0') //是合法的C的顶点
ansc = (ansc + x[i][j] % modd * sumc[i + 2][j] % modd) % modd, //计算总的C方案数量
ansf = (ansf + x[i][j] % modd * sumf[i + 2][j] % modd) % modd;
}
ansc = (c % modd) * (ansc % modd) % modd;
ansf = (f % modd) * (ansf % modd) % modd;
cout << ansc << ' ' << ansf << endl;
}
return 0;
}