20pts求调
查看原帖
20pts求调
490978
小超手123楼主2023/10/27 17:34
#include<bits/stdc++.h>
#define int long long
#define N 2010
#define mod 998244353
using namespace std;
int T, id;
int n, m, c, f;
int C, F;
char a[N][N];
int nxt[N][N], down[N][N], sum[N];
signed main() {
	cin >> T >> id;
	while(T--) {
		cin >> n >> m >> c >> f;
		C = 0, F = 0;
		for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; j++) {
			cin >> a[i][j];
			nxt[i][j] = 0;
			down[i][j] = 0;
		}
		for(int i = 1; i <= n; i++) 
		for(int j = m; j >= 1; j--) 
			if(a[i][j] == '0') nxt[i][j] = nxt[i][j + 1] + 1;
		for(int j = 1; j <= m; j++) {
			for(int i = n; i >= 1; i--) {
				if(a[i][j] == '0') down[i][j] = down[i + 1][j] + 1;
			}
		}
		for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; j++) nxt[i][j]--, down[i][j]--;
		for(int j = 1; j <= m; j++) {
			for(int i = 1; i <= n; i++) sum[i] = 0; 
			int last = 0;
			for(int i = 1; i <= n; i++) {
			    if(a[i][j] == '1') {
			    	last = i;
			    	continue;
				}
			    if(i - last >= 3) {
			    	C += nxt[i][j] * sum[i - 2] % mod, C %= mod;
			    	F += nxt[i][j] * sum[i - 2] % mod * down[i][j] % mod, F %= mod;
				} 
			    sum[i] = (sum[i - 1] + nxt[i][j]) % mod;
			}
		}
		cout << C * c << " " << F * f << endl;
	} 
	return 0;
}
/*
2 0
6 6 1 1
000010
011000
000110
010000
011000
000000
16 12 1 1
000000000001
011111111111
000000000011
011111111111
010011111111
010111100011
010011101111
011111100011
111111111111
000011111111
011111111111
000000111111
011111000111
011111011111
011111000111
011111011111
*/

2023/10/27 17:34
加载中...