#include<bits/stdc++.h>
using namespace std;
struct node{
	int val,name;
	int line;
};
int t;
int id;
int n,m;
int cnt,yes;
int num=0;
int dep;
int a[1001][1001],grou[1001][1001],brea[1001][1001];
int grouu[1001][1001],breaa[1001][1001];
vector<node>g[10001];
int ke[1001];
int c,f;
//int dis[1001][1001];
long long code,ans,anss,codd;

int main(){
	
	freopen("plant.in","r",stdin);
	freopen("plant.out","w",stdout);
	cin>>t>>id;
	while(t--){
		cin>>n>>m;
		cin>>c>>f;
		for(int i=1;i<=n;i++){
			cnt=1;
			for(int j=1;j<=m;j++){
				cin>>a[i][j];
				if(a[i][j]==1){
					brea[i][cnt]=j;
					cnt++;
				}
				else{
					grou[i][j]=cnt;
					
				}
			}
			
				brea[i][cnt]=m+1;
			
		}
		
		if(c==0&&f==0){
			cout<<0;
			return 0;
		}
		
		
		
		
		
		
		
		
		
			num=1;//di ji zu 
		int lei;
		int dao=0;
		
		for(int i=1;i<m;i++){
			yes=0;
		node lei={};
		dao=0;
			for(int j=1;j<=n;j++){
				if(a[j][i]==0){
					
					
					
					if(yes==0&&(brea[j][grou[j][i]]-i-1)>0) {
						lei.val=brea[j][grou[j][i]]-i-1;
						lei.name=j;
						lei.line =i;
						dao=1;
					}
					if(dao==1) yes++;
					if(yes>=3&&(brea[j][grou[j][i]]-i-1)>0){
						int haha=brea[j][grou[j][i]]-i-1;
						g[num].push_back(node{haha,j,i});
						
						
						
					}	
					
				}
				 if(a[j][i]==1||j==n){
				
					g[num].push_back(lei);
						yes=0;
					num++;
					dao=0;
				}
			}
		}
	//	cout<<"num="<<num<<" ";
			int cntt=1;//xiangxia 
		for(int i=1;i<=m;i++){
			cntt=1;
			for(int j=1;j<=n;j++){
				if(a[j][i]==1){
					breaa[i][cntt]=j;
					cntt++;
				}
				else{
					grouu[i][j]=cntt;
					
				}
			}
			
				breaa[i][cntt]=n+1;
			}
		
		
		
		
		
		
		ans=0;
		anss=0;
		
		int len=0;
		int ddo;
		for(int i=1;i<=num;i++){len=g[i].size();
			if(len<2) continue;
			for(int j=0;j<g[i].size()-1;j++){
				for(int k=j+1;k<g[i].size();k++){
					if(abs(g[i][j].name-g[i][k].name)>1){
					//	dep++;
						//ke[dep]=g[i][j].line;
						code=(g[i][j].val*g[i][k].val)%998244353;
					ans+=code;
			ans%=998244353;
			
			
			
			
		ddo=	max(g[i][j].name,g[i][k].name);
		if(breaa[g[i][j].line][grouu[g[i][j].line][ddo]]-ddo-1>0){
			anss+=code*((breaa[g[i][j].line][grouu[g[i][j].line][ddo]]-ddo-1)%998244353);
			anss%=998244353;
		}
					}
					
				}
			}
			
		}
		
	
		
		ans*=c;
		anss*=f;
		
		
		
		
		
		cout<<ans<<" "<<anss;
	
	for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				grou[i][j]=0;
				brea[i][j]=0;
				grouu[i][j]=0;
				breaa[i][j]=0;
			}
		}
		for(int i=1;i<=num;i++){
			for(int j=0;j<g[i].size();j++){
				g[i][j].val=0;
				g[i][j].name=0;
				g[i][j].line=0;
			}
			
			
			
			
			
		}
	}
		}
	
	
