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了