0
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

#define mod 1000000007

int main()
{

    unsigned long long int n,i,j,k;
    unsigned long long int *power = (unsigned long long int *)malloc(sizeof(unsigned long long int) * (1000000000LL));
    power[0] = 1;
    for(i = 1;i <= 1000000000LL;i++){
        power[i] = (power[i-1] * 2 ) % mod;
    }

    int t;
    scanf("%d",&t);
    while(t--){

        scanf("%lld",&n);
        unsigned long long int f = 2;
        for(i=2; i<=n;i++){
            f = (f + power[i/2]) % mod;
        }

        printf("%llu\n",f);

    }
    return 0;
}
4

4 回答 4

6

肯定power[1000000000]是越界了!您的数组没有那么多元素。你需要<,而不是<=在循环中。

于 2012-09-03T14:25:39.117 回答
4

您应该检查是否malloc正确分配power

于 2012-09-03T14:25:10.587 回答
2

因为您没有测试malloc的返回值。它通过给出 NULL 失败(例如,当内存不足时)。

于 2012-09-03T14:25:39.150 回答
0

这不是一个好主意

for(i = 1;i <= 1000000000LL;i++){ 

无论如何,索引都是从零开始的,但是您应该将 a 替换为<=a<以防止读取超出数组的末尾

还考虑到您尝试分配的数组的大小,您应该检查您的power指针是否有效。

于 2012-09-03T14:26:50.240 回答