悬关#32WA~~
查看原帖
悬关#32WA~~
956316
77Glorious楼主2024/9/18 15:47
#include <bits/stdc++.h>
#define modd 998244353
using namespace std;
char a[1010][1010];
int x[1010][1010], y[1010][1010], ansc, ansf, sumc[1010][1010], sumf[1010][1010];
int t, id, n, m, c, f, vc, vf;

int main() {
	ios::sync_with_stdio(0);
	cin >> t >> id;

	while (t--) {
		cin >> n >> m >> c >> f;
		memset(a, ' ', sizeof(a));
		memset(x, 0, sizeof(x));
		memset(y, 0, sizeof(y));
		memset(sumc, 0, sizeof(sumc));
		memset(sumf, 0, sizeof(sumf));
		ansc = 0, ansf = 0;
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= m; j++)
				cin >> a[i][j];
		for (int i = 1; i <= n; i++)
			for (int j = m - 1; j >= 1; j--)
				if (a[i][j] == '0' && a[i][j + 1] == '0')
					x[i][j] = x[i][j + 1] + 1; //计算每一个合法的点向右一共能形成的线段数

		for (int j = 1; j <= m; j++)
			for (int i = n - 1; i >= 1; i--)
				if (a[i][j] == '0' && a[i + 1][j] == '0')
					y[i][j] = y[i + 1][j] + 1; //计算向下一共能形成的线段数 


		for (int j = 1; j <= m; j++) { //枚举列数,以计算sumc(i,j)数量
			for (int i = n; i >= 1; i--)
				if (a[i][j] == '0')
					sumc[i][j] = sumc[i + 1][j] + x[i][j] * 1ll % modd, sumf[i][j] = sumf[i + 1][j] + x[i][j] * y[i][j] * 1ll % modd;
		}
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= m; j++) { //枚举每一个格子
				if (a[i][j] == '0' && a[i][j + 1] == '0' && a[i + 1][j] == '0' && a[i + 2][j] == '0') //是合法的C的顶点 
					ansc = (ansc + x[i][j] % modd * sumc[i + 2][j]  % modd) % modd, //计算总的C方案数量
					ansf = (ansf + x[i][j] % modd * sumf[i + 2][j]  % modd) % modd;
			}
		ansc = (c % modd) * (ansc % modd) % modd;
		ansf = (f % modd) * (ansf % modd) % modd;
		cout << ansc << ' ' << ansf << endl;
	}
	return 0;
}
2024/9/18 15:47
加载中...