#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int Mod = 998244353;
const int MAX = 1e3 + 5;

int T,id,n,m,c,f,mul[MAX][MAX],y3;
int lim=0,cnt=0,start=0,data=0;
ll Vc,Vf,ansc,ansf;
bool flagc=0,flagf=0,ff=0;
char a[MAX][MAX];
struct Dat{
	int w,y,d;
}w[MAX];

void get(int cnt){
	Vc=Vf=0;
	for(int i=1;i<cnt;i++){
		for(int k=i+1;k<=cnt;k++){
			if(w[i].d-w[k].d>=2){
				Vc=(Vc+(w[i].w*w[k].w))%Mod;
				Vf=(Vf+(w[i].w*w[k].w*(w[k].d)))%Mod;
			}
		}
	}
}

void doit(int j){
	for(int q=1;q<=cnt;q++){
		w[q].d=start+lim-w[q].y-1;
	}
	if(lim>=3){
		get(cnt);
		ansc=(ansc+Vc)%Mod;
	}
	if(lim>=4){
		ansf=(ansf+Vf)%Mod;
	}
}        
                          
int main()                   
{
	freopen("plant.in","r",stdin);
	freopen("plant.out","r",stdout); 
	cin>>T>>id;
	while(T--){
		memset(mul,0,sizeof(mul));
		cin>>n>>m>>c>>f;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				cin>>a[i][j];
			}
		}
		for(int j=1;j<=m;j++){
			lim=0;cnt=0;start=0;
			for(int i=1;i<=n;i++){
				if(a[i][j]=='1'){
					if(start!=0&&i-start>2){
						ff=1;data++;
						doit(j);
					}
					start=0,lim=0,cnt=0;
				}
				if(a[i][j]=='0'){
					if(lim==0) start=i;
					lim++;
					for(int k=j;k<=m;k++){
						if(a[i][k]=='0'){
							mul[i][j]++;
						}
						else if(a[i][k]=='1'){
							break;
						}
					}		
				}
				if(mul[i][j]>1){
					w[++cnt].w=(mul[i][j]-1);
					w[cnt].y=i;
				}
			}
			doit(j);
		}
		if(c==0) ansc=0;
		if(f==0) ansf=0;
		cout<<ansc<<" "<<ansf<<endl;
	}	
	return 0;
}
                             