如题,鄙人昨天在写P1045 [NOIP2003 普及组] 麦森数的时候因为数组定义顺序的区别导致一个能够ac,一个连正确答案都无法输出。
我定义了三个数组,一个的顺序是先power2,再res,最后mul。这个代码就可以AC这道题。但是,如果我定义的顺序为先power2,再mul,最后res,这样输出答案的时候连样例都不会过。
对于第一份代码,我开1e3+10的空间就能过,但是第二份代码不管开多大都会存在数组越界(比如1e8),就这让我看了一个小时都没找到问题出在哪个地方。我打死也不会想到是数组定义的顺序不同就会导致这么神奇的结果。
有没有大佬知道是什么原因吗?
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
//int power2[N], res[N], mul[N];(可AC)
int power2[N], mul[N], res[N];
int n;
int main() {
scanf("%d", &n);
printf("%d", (int)(log10(2) * n + 1));
res[1] = 1;
power2[1] = 2;
while (n != 0) {
if (n % 2 == 1) {
memset(mul, 0, sizeof mul);
for (int i = 1; i <= 500; i++)
for (int j = 1; j <= 500; j++)
mul[i + j - 1] += res[i] * power2[j];
for (int i = 1; i <= 500; i++) {
mul[i + 1] += mul[i] / 10;
mul[i] %= 10;
}
for (int i = 0; i <= N * 2; i++) res[i] = mul[i];
}
n /= 2;
memset(mul, 0, sizeof mul);
for (int i = 1; i <= 500; i++)
for (int j = 1; j <= 500; j++)
mul[i + j - 1] += power2[i] * power2[j];
for (int i = 1; i <= 500; i++) {
mul[i + 1] += mul[i] / 10;
mul[i] %= 10;
}
for (int i = 0; i <= N * 2; i++) power2[i] = mul[i];
}
res[1] -= 1;
for (int i = 500; i >= 1; i--) {
if (i % 50 == 0) printf("\n%d", res[i]);
else printf("%d", res[i]);
}
return 0;
}