1 pts 求调 ( 玄关 )
查看原帖
1 pts 求调 ( 玄关 )
574921
Dress楼主2024/8/22 14:56
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1007;
const int mod=998244353;
inline int read(){
	int XX=0,FF=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')
			FF*=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		XX=XX*10+ch-48;
		ch=getchar();
	}
	return XX*FF;
}
int a[N][N];
int b[N][N],c[N][N];  
int sum1[N][N],sum2[N][N];
int ans1,ans2;
signed main(){
	ios::sync_with_stdio(false);
	int T=read(),id=read();
	while(T--){
		memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(c,0,sizeof(c));
        memset(sum1,0,sizeof(sum1));
        memset(sum2,0, sizeof(sum2));
        ans1=ans2=0;
		int n=read(),m=read();
		int C=read(),F=read();
		for(int i=1;i<=n;++i){
			for(int j=1;j<=m;++j){
				char ch;
				cin>>ch;
				a[i][j]=ch-'0';
			}
		}
		for(int i=1;i<=n;++i){
			for(int j=m;j>=1;--j){
				if(!a[i][j]){
					b[i][j]=b[i][j+1]+1;
				}
				else {
					b[i][j]=0;
				}
			}
		}
		for(int i=n;i>=1;--i){
			for(int j=1;j<=m;++j){
				if(!a[i][j]){
					c[i][j]=c[i+1][j]+1;
				}
				else {
					c[i][j]=0;
				}
			}
		}
		for(int i=n-2;i>=1;--i){
			for(int j=1;j<=m;++j){
				if(a[i][j]==1||a[i+1][j]==1||a[i+2][j]==1){
					sum1[i][j]=0;
				}
				else {
					sum1[i][j]=(sum1[i+1][j]+b[i+2][j]-1)%mod;
				}
			}
		}
		for(int i=n-3;i>=1;--i){
			for(int j=1;j<=m;++j){
				if(a[i][j]==1||a[i+1][j]==1||a[i+2][j]==1){
					sum2[i][j]=0;
				}
				else {
					sum2[i][j]=(sum2[i+1][j]+(c[i+2][j]-1)*(b[i+2][j]-1)%mod)%mod;
				}
			}
		}
		for(int i=1;i<=n;++i){
			for(int j=1;j<=m;++j){
				if(b[i][j]>0){
					ans1+=(b[i][j]-1)*sum1[i][j]%mod;
					ans2+=(b[i][j]-1)*sum2[i][j]%mod;
				}
				ans1%=mod,ans2%=mod;
			}
		}
		cout<<ans1*C%mod<<' '<<ans2*F%mod<<endl;
	}
	return 0;
}
2024/8/22 14:56
加载中...