#include<bits/stdc++.h>
using namespace std;
int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		x=(x<<3)+(x<<1)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
const int M=998244353,N=1005;
int numx[N][N],n,m,cn,fn;
bool a[N][N];
void jzx(){
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			if(!a[i][j]){
				int locx=j,num=0,locy;
				for(int k=j+1;k<=m;k++){
					if(!a[i][k]){
						num++;
						if(k==m) locy=k;
					}
					else{
						locy=k-1;
						j=k;
						break;
					}
				}
				for(int k=locx;k<=locy;k++) numx[i][k]=num,num--;
			}
		}
}
int dp[N][8];
void mm(int x){
	dp[x][0]%=M;dp[x][1]%=M;dp[x][2]%=M;dp[x][3]%=M;dp[x][4]%=M;
}
void c(){
	long long ans=0;
	for(int u=1;u<=m;u++){
		memset(dp,0,sizeof(dp));
		for(int i=1;i<=n;i++){
			dp[i][0]=dp[i-1][0]+dp[i-1][3];
			if(!a[i][u]){
				dp[i][1]=numx[i][u];
				dp[i][2]=dp[i-1][1]+dp[i-1][2];
				dp[i][3]=dp[i-1][2]*numx[i][u];
			}
			mm(i);
		}
		ans+=dp[n][0]+dp[n][3];
		ans%=M;
	}
	printf("%lld ",ans%M);
}
void f(){
	long long ans=0;
	for(int u=1;u<=m;u++){
		memset(dp,0,sizeof(dp));
		for(int i=1;i<=n;i++){
			dp[i][0]=dp[i-1][0]+dp[i-1][4];
			if(!a[i][u]){
				dp[i][1]=numx[i][u];
				dp[i][2]=dp[i-1][1]+dp[i-1][2];
				dp[i][3]=dp[i-1][2]*numx[i][u];
				dp[i][4]+=dp[i-1][3]+dp[i-1][4];
			}
			mm(i);
		}
		ans+=dp[n][0]+dp[n][4];
	}
	printf("%lld ",ans%M);
}
int main(){
	freopen("plant.in","r",stdin);
	freopen("plant.out","w",stdout);
	int T=read(),id=read();
	while(T--){
		n=read(),m=read(),cn=read(),fn=read();
		memset(numx,0,sizeof(numx));
		for(int i=1;i<=n;i++){
			char s[1005];
			cin>>s+1;
			for(int j=1;j<=m;j++){
				if(s[j]=='1') a[i][j]=1;
				else a[i][j]=0;
			}
		}
		if(cn==0&&fn==0){
			printf("0 0\n");
			continue;
		}
		jzx();
		if(cn)c();
		else printf("0 ");
		if(fn)f();
		else printf("0\n");
	}
	return 0;
}