12pts求条
查看原帖
12pts求条
511657
liwenbo_1919810楼主2024/11/28 19:58
#include<iostream>
using namespace std;
#define ll long long
#define rep(i,x,y) for(int i(x);i<=y;++i)
#define max(x,y) y-x>>63?x:y
const ll mod(998244353);
const int N(1010);int t,n,m,id;
ll f[N][N],f3[N][N],f2[N][N],f4[N][N];ll ans1,c1,f1,lc,ans2;
char c[N][N];

inline void Mo(ll &x) {x-=x/mod*mod;}

inline void solve()
{
	cin>>n>>m>>c1>>f1;
	rep(i,1,n) cin>>c[i];//,f[i][0]=1;
//	rep(i,1,m) f[0][1]=1;
	rep(i,1,n)
	{
		rep(j,0,m-1)
			f2[i][j+1]=c[i][j]=='1'?0:(f2[i-1][j+1]+1),Mo(f2[i][j+1]);
		for(int j(m-1);j>=0;--j)
			f[i][j+1]=c[i][j]=='1'?0:(f[i][j+2]+1),Mo(f[i][j+1]);
	}
//	rep(i,1,n)
//	{
//		rep(j,1,m) cout<<f[i][j]<<' ';
//		cout<<'\n';
//	}
//	rep(i,1,n)
//	{
//		rep(j,1,m) cout<<f2[i][j]<<' ';
//		cout<<'\n';
//	}
	rep(i,1,n)
		rep(j,1,m)
			f3[i][j]=c[i][j-1]=='1'?0:(f3[i-1][j]+max(f[i][j]-1,0ll)),Mo(f3[i][j]);
//	rep(i,1,n)
//	{
//		rep(j,1,m) cout<<f3[i][j]<<' ';
//		cout<<'\n';
//	}
	rep(i,1,n)
		rep(j,1,m)
			if(c[i][j-1]=='0')
			{
				if(f[i][j]>1&&f2[i][j]>2)
					lc=f3[i-2][j]*(f[i][j]-1),Mo(lc),ans1+=lc,f4[i][j]+=lc,Mo(ans1),Mo(f4[i][j]);
				if(f2[i][j]>3)
					ans2+=f4[i-1][j],f4[i][j]=f4[i-1][j],Mo(ans2);
			}
	cout<<ans1*c1%mod<<' '<<ans2*f1%mod<<'\n',ans1=ans2=0;
	rep(i,1,n)
		rep(j,1,m)
			f[i][j]=f2[i][j]=f3[i][j]=f4[i][j]=0;
}

int main()
{//freopen("121.in","r",stdin),
//freopen("plant.in","r",stdin),freopen("plant.out","w",stdout),
	ios::sync_with_stdio(0),cin.tie(nullptr),cout.tie(nullptr),
	cin>>t>>id;
	while(t--)
		solve();
	return 0;
}/*
10 0
6 6 1 1
000010
011000
000110
010000
011000
000000
6 6 1 1
000010
011000
000110
010000
011000
000000
*/
2024/11/28 19:58
加载中...