民间数据T两个点,官方数据只过了前四个。
#include <iostream>
#define mod 998244353ll
using namespace std;
int T, id;
long long n, m, c, f;
long long a[1005][1005], s1[1005][1005], t[1005][1005], tt[1005][1005];
long long s2[1005][1005];
void init()
{
scanf("%d%d%d%d", &n, &m, &c, &f);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
t[i][j] = a[i][j] = s1[i][j] = s2[i][j] = tt[i][j] = 0;
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
scanf("%1d",&a[i][j]);
s1[i][j] = s1[i-1][j]+s1[i][j-1]-s1[i-1][j-1]+a[i][j];
t[i][j] = 0;
}
for (int i = 1; i <= n; i++)
for (int j = m; j >= 1; j--)
if (a[i][j] == 0) t[i][j] = t[i][j+1] + 1;
for (int j = 1; j <= m; j++)
for (int i = n; i >= 1; i--)
if (a[i][j] == 0) tt[i][j] = tt[i+1][j] + 1;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
s2[i][j] = (s2[i-1][j]+s2[i][j-1]-s2[i-1][j-1]+max(0ll,t[i][j]-1)+mod)%mod;
}
long long gs(long long s[1005][1005], int x1, int y1, int x2, int y2)
{
return (s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]+mod)%mod;
}
void print()
{
puts("a:");
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++) printf("%3d", a[i][j]);
puts("");
}
puts("t:");
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++) printf("%3d", t[i][j]);
puts("");
}
puts("tt:");
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++) printf("%3d", tt[i][j]);
puts("");
}
puts("s2:");
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++) printf("%3d", s2[i][j]);
puts("");
}
}
int main()
{
scanf("%d%d", &T, &id);
while (T--)
{
init();
print();
long long ans1 = 0, ans2 = 0;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
if (a[i][j] || t[i][j] == 1) continue;
if (i+2 <= i+tt[i][j]-1)
ans1 = (ans1 + gs(s2, i+2, j, i+tt[i][j]-1, j)*(t[i][j]-1)%mod) % mod;
if (i+2 <= i+tt[i][j]-2)
{
// ans2 = (ans2 + gs(s2, i+2, j, i+tt[i][j]-2, j)*(t[i][j]-1)%mod) % mod;
for (int k = i + 3; k <= i+tt[i][j]-1; k++)
{
ans2 = (ans2 + gs(s2, i+2, j, k-1, j)*(t[i][j]-1)%mod) % mod;
}
}
// printf("(%d,%d)->(%d, %d): %d\n",i, j, i+2, i+tt[i][j]-1, gs(s2, i+2, j, i+tt[i][j]-1, j));
// printf("%d %d\n", gs(s2, i, j+2, i, j+tt[i][j]-1), gs(s2, i, j+2, i, j+tt[i][j]-2));
}
}
printf("%lld %lld\n", ans1*c%mod, ans2*f%mod);
}
return 0;
}