题目描述
AC鸭收到一个玩具,他特别喜欢,因为这个玩具就像一个电子版的俄罗斯套娃,可以一步一步的打开,经过AC鸭的“破坏性”研究,他发现这个玩具的原理:这就是一个n行m列的矩阵,多次询问,对一个子矩阵求∏ka[i][j]取余98244353
∏ 即累乘,本题题意换句话说就是用子矩阵中的每个a[i][j]求k的幂,然后把这些幂都乘起来。
输入格式
第一行一个整数n,m,表示矩阵的规模.
接下来n行,每行m个正整数。
接下来一个整数q, 表示询问次数。
接下来q行,每行先输入一个整数k, 接下来4个整数xa,xb,ya,yb, 表示询问的子矩阵的左上角和右下角。
输出格式
输出q行,表示对每次询问的答案。
数据规模
1≤n,m≤10000;0≤a[i][j]≤1000;q≤105
输入数据 1
5 5
8 2 1 4 1
2 4 5 6 2
2 4 6 7 1
3 0 4 3 6
2 3 43 4 4
3
3 2 2 5 4
12 2 1 4 5
4 1 1 5 5
输出数据 1
92111904
60120458
34784127
我的10分代码
#include <bits/stdc++.h>
using namespace std;
const int MOD = 98244353;
const int MAXN = 1005;
int n, m;
int a[MAXN][MAXN];
int ret[MAXN][MAXN];
int pow_mod(int base, int exponent) {
if (exponent == 0) {
return 1;
}
long long result = 1;
long long x = base;
while (exponent > 0) {
if (exponent % 2 == 1) {
result = (result * x) % MOD;
}
x = (x * x) % MOD;
exponent /= 2;
}
return result;
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
scanf("%d", &a[i][j]);
ret[i][j] = (a[i][j] + ret[i][j - 1]) % (MOD - 1);
}
}
for (int j = 1; j <= m; j++) {
for (int i = 1; i <= n; i++) {
ret[i][j] = (ret[i][j] + ret[i - 1][j]) % (MOD - 1);
}
}
int q;
scanf("%d", &q);
while (q--) {
int k;
int xa, ya;
int xb, yb;
scanf("%d%d%d%d%d", &k, &xa, &ya, &xb, &yb);
int tot = ret[xb][yb];
if (xa > 1) {
tot = (tot - ret[xa - 1][yb] + MOD - 1) % (MOD - 1);
}
if (ya > 1) {
tot = (tot - ret[xb][ya - 1] + MOD - 1) % (MOD - 1);
}
if (xa > 1 && ya > 1) {
tot = (tot + ret[xa - 1][ya - 1]) % (MOD - 1);
}
printf("%d\n", pow_mod(k, tot));
}
return 0;
}
怎么调试才能AC?