对于每一个测试案例,你的代码必须显示包含一个整数的单独一行,这就是行和与列和都等于R的3x3矩阵的总数。 数值可能很大,因此你必须以模10^9+7的形式返回结果。 样例输入 复制 3 1 2 3 3 1 2 3 样例输出 复制 6 21 55 6 21 55代码实现
时间: 2024-05-19 08:13:50 浏览: 35
#include <iostream>
#include <cstring>
using namespace std;
const int MOD = 1e9 + 7;
int sum[10][10][10][10]; // 记录前缀和
int main() {
int n, r;
while (cin >> n >> r) {
memset(sum, 0, sizeof(sum));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
int x;
cin >> x;
for (int a = 1; a <= 9; a++) {
for (int b = 1; b <= 9; b++) {
if (a + b - x == r) { // 判断是否符合要求
sum[i][j][a][b] = 1; // 标记为一个合法的3x3矩阵
}
sum[i][j][a][b] += sum[i-1][j][a][b] + sum[i][j-1][a][b] - sum[i-1][j-1][a][b]; // 求前缀和
}
}
}
}
for (int k = 1; k <= n; k++) {
for (int l = 1; l <= n; l++) {
long long ans = 0;
for (int a = 1; a <= 9; a++) {
for (int b = 1; b <= 9; b++) {
if (a == k && b == l) continue; // 排除中心点
int c = r - a - b; // 第三个数
if (c < 1 || c > 9) continue; // 超出范围
ans = (ans + 1LL * sum[k+1][l+1][c][9] * sum[1][1][1][a-1] % MOD * sum[1][l+1][10-b][9] % MOD * sum[k+1][1][10-c][9] % MOD) % MOD; // 计算方案数
}
}
cout << ans << " ";
}
cout << endl;
}
}
return 0;
}
阅读全文