记录
#include<bits/stdc++.h>
typedef unsigned long long ull;
using namespace std;
const ull mod=998244353;
const int maxi=1e3+9;
bitset<maxi> a[maxi];
int cntx[maxi][maxi],cnty[maxi][maxi];
int T,id,N,M,C,F;
ull ans1,ans2;
namespace T1{
inline ull fmul(ull a,ull b){
ull ans=0;
for(;b;a=(a<<1)%mod,b>>=1){
if(b&1)ans=(a+ans)%mod;
}
return ans;
}
inline void clear_(){
for(int i=1;i<=N;i++){
a[i]=0;
for(int j=1;j<=M;j++){
cntx[i][j]=cnty[i][j]=0;
}
}
ans1=ans2=0;
}
inline void getin(){
cin>>N>>M>>C>>F;
for(int i=1;i<=N;i++){
for(int j=1;j<=M;j++){
char t;
t=getchar();
for(;t=='\n';)t=getchar();
a[i][j]=(t=='0'?0:1);
}
}
}
inline void pretreat(){
for(int i=N;i>=1;i--){
for(int j=M;j>=1;j--){
if(!a[i][j]){
cntx[i][j]=cntx[i][j+1]+1;
cnty[i][j]=cnty[i+1][j]+1;
}
}
}
}
inline void statis(){
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
if(a[i][j]
||cntx[i][j]<=1
||cnty[i][j]<=2)continue;
for(int k=i+2;k<=N;k++){
if(a[k][j])break;
ans1=(ans1+fmul(cntx[i][j]-1,cntx[k][j]-1))%mod;
if(cnty[k][j]>=2);
ans2=(ans2+fmul(fmul(cntx[i][j]-1,cntx[k][j]-1),cnty[k][j]-1))%mod;
}
}
}
}
inline void output(){
printf("%llu %llu\n",fmul(ans1,C),fmul(ans2,F));
}
inline void solve(){
clear_();
getin();
pretreat();
statis();
output();
}
inline void init(){
cin>>T>>id;
for(int i=1;i<=T;i++)solve();
}
}
int main(){
T1::init();
return 0;
}