#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<vector>
using namespace std;
typedef long long ll;
const int N=1e3+5,inf=1e9+5;
const long long mod=998244353;
int n,id,T,m,c,f;
ll C,F;
int a[N][N];
vector<int> heng[N],shu[N];
void solve() {
F=0,C=0;
// scanf("%d%d%d%d",&n,&m,&c,&f);
memset(a,0,sizeof(a));
cin>>n>>m>>c>>f;getchar();
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
a[i][j]=getchar();
if(!T||i!=n)getchar();
}
// for(int i=1; i<=n; i++)scanf(" %s",a[i]+1);
for(int i=1; i<=m; i++) shu[i].clear();
for(int i=1; i<=n; i++) heng[i].clear();
for(int i=1;i<=100;i++) shu[i].clear(),heng[i].clear();
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
if(a[i][j]=='1')
heng[i].push_back(j),shu[j].push_back(i-1);
}
}
for(int i=1; i<=n; i++) heng[i].push_back(m+1);
for(int j=1; j<=m; j++) shu[j].push_back(n),shu[j].push_back(n+1);
for(int i=1; i<=m; i++) {
int fir=1;
while(1) {
int las=lower_bound(shu[i].begin(),shu[i].end(),fir)-shu[i].begin();
las=shu[i][las];
if(a[las][i]=='1') {
fir=las+1;
while(a[fir][i]=='1') fir++;
continue;
}
if(las>n) break;
long long LC,FC;
for(int x_1=fir; x_1<=las; x_1++) {
LC=0,FC=0;
int c1=upper_bound(heng[x_1].begin(),heng[x_1].end(),i)-heng[x_1].begin();
c1=heng[x_1][c1];
for(int x_2=x_1+2; x_2<=las; x_2++) {
int c2=upper_bound(heng[x_2].begin(),heng[x_2].end(),i)-heng[x_2].begin();
c2=heng[x_2][c2];
LC=(LC+(c1-i-1)*(c2-i-1)%mod)%mod;
C=(C+LC)%mod;
int z=lower_bound(shu[i].begin(),shu[i].end(),x_2)-shu[i].begin();
z=shu[i][z];
FC=(FC+(z-x_2)*LC%mod)%mod;
F=(F+FC)%mod;
FC=0;
LC=0;
C%=mod,F%=mod;
}
C=(C+LC)%mod;
F=(F+FC)%mod;
}
if(las>=n) break;
fir=las+1;
while(a[fir][i]=='1') fir++;
}
}
printf("%lld %lld\n",C*c%mod,F*f%mod);
return ;
}
int main() {
// freopen("plant.in","r",stdin);
// freopen("plant.out","w",stdout);
// scanf("%d%d",&T,&id);
cin>>T>>id;
while(T--) {
solve();
}
return 0;
}