#include<bits/stdc++.h>
#define Max(x,y) ((x<y)&&(x=y))
#define Min(x,y) ((x>y)&&(x=y))
using namespace std;

typedef long long ll;
const ll P=998244353;
const int M=1005;

inline int read()
{
	int x=0,f=1;static char ch;
	while(ch=getchar(),ch<48)if(ch==45)f=0;
	do x=(x<<1)+(x<<3)+(ch^48);
	while(ch=getchar(),ch>=48);
	return f?x:-x;
}

int n,m,c,f,a[M][M];
char s[M];

void ADD(ll &x,ll y){(x+=y)>=P?x-=P:x;}

namespace P62
{
	int to[M][M],dn[M][M];
	void solve()
	{
		memset(to,0,sizeof(to));
		for(int i=1;i<=n;i++)
			for(int j=m;j>0;j--)
			{
				if(a[i][j])to[i][j]=0;
				else to[i][j]=to[i][j+1]+1;
			}
		ll ans1=0,tmp;
		for(int k=1;k<m;k++)
			for(int i=1;i<=n-2;i++)
			{
				if(a[i][k]||a[i+1][k])continue;
				for(int j=i+2;j<=n;j++)
				{
					if(a[j][k])break;
					tmp=(to[i][k]-1)*(to[j][k]-1)%P;
//					printf("(%d,%d)_%d %lld\n",i,j,k,tmp);
					ADD(ans1,tmp);
				}
			}
		ans1=ans1*c;
		
		memset(dn,0,sizeof(dn));
		for(int j=1;j<=m;j++)
			for(int i=n;i>0;i--)
			{
				if(a[i][j])dn[i][j]=0;
				else dn[i][j]=dn[i+1][j]+1;
			}
		ll ans2=0;
		for(int k=1;k<m;k++)
			for(int i=1;i<=n-3;i++)
			{
				if(a[i][k]||a[i+1][k])continue;
				for(int j=i+2;j<=n;j++)
				{
					if(a[j][k])break;
					tmp=1ll*(to[i][k]-1)*(to[j][k]-1)%P*(dn[j][k]-1)%P;
					ADD(ans2,tmp);
				}
			}
		ans2=ans2*f;
		
		printf("%lld %lld\n",ans1,ans2);
	}
}
namespace P100
{
	int to[M][M],dn[M][M];
	ll sum[M][M];
	void solve()
	{
		memset(to,0,sizeof(to));
		for(int i=1;i<=n;i++)
			for(int j=m;j>0;j--)
			{
				if(a[i][j])to[i][j]=0;
				else to[i][j]=to[i][j+1]+1;
			}
		memset(sum,0,sizeof(sum));
		for(int k=1;k<m;k++)
			for(int i=1;i<=n;i++)
			{
				if(a[i][k])sum[i][k]=0;
				else sum[i][k]=(sum[i-1][k]+to[i][k]-1)%P;
			}
		
		ll ans1=0,tmp;
		for(int k=1;k<m;k++)
			for(int i=3;i<=n;i++)
			{
				if(a[i][k]||a[i-1][k])continue;
				tmp=sum[i-2][k]*(to[i][k]-1)%P;
				ADD(ans1,tmp);
			}
		ans1=ans1*c;
		
		memset(dn,0,sizeof(dn));
		for(int j=1;j<=m;j++)
			for(int i=n;i>0;i--)
			{
				if(a[i][j])dn[i][j]=0;
				else dn[i][j]=dn[i+1][j]+1;
			}
		ll ans2=0;
		for(int k=1;k<m;k++)
			for(int i=3;i<n;i++)
			{
				if(a[i][k]||a[i-1][k])continue;
				tmp=sum[i-2][k]*(to[i][k]-1)%P;
				tmp=tmp*(dn[i][k]-1)%P;
				ADD(ans2,tmp);
			}
		ans2=ans2*f;
		
		printf("%lld %lld\n",ans1,ans2);
	}
}

int main()
{
	freopen("plant.in","r",stdin);
	freopen("plant.out","w",stdout);
	
	int T=read(),id=read();
	for(int cas=1;cas<=T;cas++)
	{
		n=read(),m=read(),c=read(),f=read();
		for(int i=1;i<=n;i++)
		{
			scanf("%s",s+1);
			for(int j=1;j<=m;j++)
				a[i][j]=s[j]^48;
		}
		
		if(c==0&&f==0){printf("0 0\n");continue;}
		if(n<=300&&m<=300||n<=1000&&m==2)P62::solve();
		else P100::solve();
	}
	
	return 0;
}
/*
1 0
4 4 1 1
0000
0000
0111
0111
*/
