大家帮忙看看这段高精为何会RE。。。

P1045 [NOIP2003 普及组] 麦森数

Dilute @ 2017-11-19 20:36:53

struct hugeint{
    int num[919526];
    int len;
}k, ans;
hugeint m1(hugeint x){
    for(int i = 1; i <= x.len / 2; i++) swap(x.num[i], x.num[x.len - i + 1]);
    x.num[1]--;
    int i = 1;
    x.num[0] = 1;
    while(i <= x.len && x.num[i] <= 0){
        x.num[i] = 9;
        x.num[i+1]--;
        i++;
    }
    if(x.num[x.len] <= 0) x.len--;
    for(int i = 1; i <= x.len / 2; i++) swap(x.num[i], x.num[x.len - i + 1]);
    hugeint ans = x;
    return ans;
}
hugeint c(hugeint a, hugeint b){
    hugeint ans;
    for(int i = 1; i <= a.len / 2; i++) swap(a.num[i], a.num[a.len - i + 1]);
    for(int i = 1; i <= b.len / 2; i++) swap(b.num[i], b.num[b.len - i + 1]);
    memset(ans.num, 0, sizeof(ans.num));
    for(int i = 1; i <= a.len; i++){
        for(int j = 1; j <= b.len; j++){
            ans.num[i + j - 1] += a.num[i] * b.num[j];
        }
    } 
    ans.len = a.len + b.len - 1;
    for(int i = 1; i <= ans.len; i++){
        ans.num[i+1] += ans.num[i] / 10;
        ans.num[i] %= 10;
    }
    while(ans.num[ans.len] >= 10){
        ans.num[ans.len+1] += ans.num[ans.len] / 10;
        ans.num[ans.len] %= 10;
        ans.len++;
    }
    if(ans.num[ans.len] == 0) ans.len--;
    int m = ans.len / 2;
    for(int i = 1; i <= m; i++) swap(ans.num[i], ans.num[ans.len - i + 1]);
    return ans;
}
void print(hugeint x){
        for(int i = x.len - 500 + 1; i <= x.len; i++)
            if(i >= 1)
                printf("%d", x.num[i]);
            else
                printf("0");
}

by Dilute @ 2017-11-19 20:37:19

struct hugeint{
    int num[919526];
    int len;
}k, ans;

hugeint m1(hugeint x){
    for(int i = 1; i <= x.len / 2; i++) swap(x.num[i], x.num[x.len - i + 1]);
    x.num[1]--;
    int i = 1;
    x.num[0] = 1;
    while(i <= x.len && x.num[i] <= 0){
        x.num[i] = 9;
        x.num[i+1]--;
        i++;
    }
    if(x.num[x.len] <= 0) x.len--;
    for(int i = 1; i <= x.len / 2; i++) swap(x.num[i], x.num[x.len - i + 1]);
    hugeint ans = x;
    return ans;
}

hugeint c(hugeint a, hugeint b){
    hugeint ans;
    for(int i = 1; i <= a.len / 2; i++) swap(a.num[i], a.num[a.len - i + 1]);
    for(int i = 1; i <= b.len / 2; i++) swap(b.num[i], b.num[b.len - i + 1]);
    memset(ans.num, 0, sizeof(ans.num));
    for(int i = 1; i <= a.len; i++){
        for(int j = 1; j <= b.len; j++){
            ans.num[i + j - 1] += a.num[i] * b.num[j];
        }
    } 
    ans.len = a.len + b.len - 1;
    for(int i = 1; i <= ans.len; i++){
        ans.num[i+1] += ans.num[i] / 10;
        ans.num[i] %= 10;
    }
    while(ans.num[ans.len] >= 10){
        ans.num[ans.len+1] += ans.num[ans.len] / 10;
        ans.num[ans.len] %= 10;
        ans.len++;
    }
    if(ans.num[ans.len] == 0) ans.len--;
    int m = ans.len / 2;
    for(int i = 1; i <= m; i++) swap(ans.num[i], ans.num[ans.len - i + 1]);
    return ans;
}

void print(hugeint x){
        for(int i = x.len - 500 + 1; i <= x.len; i++)
            if(i >= 1)
                printf("%d", x.num[i]);
            else
                printf("0");
}

by Dilute @ 2017-11-19 20:41:46

然后似乎问题出在这段里面

while(p > 0){
        if(p % 2 == 1) ans = c(ans, k);
        p /= 2;
        k = c(k, k);
    }
    printf("%d\n", ans.len);
    print(m1(ans));

by Dilute @ 2017-11-19 20:42:27

只要把这段注释掉就不会RE了

interesting

|