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

P1045 [NOIP2003 普及组] 麦森数

```cpp 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


然后似乎问题出在这段里面 ```cpp 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:41:46


只要把这段注释掉就不会RE了 $interesting$
by Dilute @ 2017-11-19 20:42:27


|