题解
根据输入nm O(N^2)暴力打出行和列每个位置∑nm的覆盖次数h和l 使用差分+前缀和优化加法
接受数据的同时计算答案 如果当前位置为1则加上覆盖次数 即ans += a[i][j]*h[i]*l[j]
AC代码
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int MOD = 998244353;
const int MAXN = 2e3 + 10;
ll a[MAXN][MAXN], h[MAXN], l[MAXN]; //行列覆盖次数
int main()
{
#ifdef LOCAL
freopen("C:/input.txt", "r", stdin);
#endif
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = i; j <= n; j++)
h[i]++, h[j + 1]--; //差分
for (int i = 1; i <= n; i++)
h[i] = (h[i - 1] + h[i]) % MOD; //前缀和
for (int i = 1; i <= m; i++)
for (int j = i; j <= m; j++)
l[i]++, l[j + 1]--;
for (int i = 1; i <= m; i++)
l[i] = (l[i - 1] + l[i]) % MOD;
ll ans = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
char c;
scanf(" %c", &c);
a[i][j] = c - '0';
ans = (ans + h[i] * l[j] * a[i][j]) % MOD;
}
cout << ans << endl;
return 0;
}