压位高精快速幂,90pts,#2 WA

P1045 [NOIP2003 普及组] 麦森数

hzx198 @ 2024-03-07 05:43:12

压 5 位高精,100 位以上直接截断,为什么错?

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct N {ll v[200];}; // v[0] 记录位数
// 高精乘高精
N operator*(const N& a, const N& b) {
  if (a.v[0] < b.v[0]) return b * a;
  N r = {{1, 0}}; // 位数为 1, 值为 0
  for (int i = 1; i <= b.v[0]; i++) {
    for (int j = 1; j <= a.v[0]; j++) {
      r.v[i + j - 1] += a.v[j] * b.v[i];
    }
  }
  for (int i = 1; i <= r.v[0]; i++) {
    if (r.v[i] >= 100000) {
      r.v[i + 1] += r.v[i] / 100000;
      r.v[i] %= 100000;
      if (i == r.v[0] && i < 100) r.v[0]++; // 100 位以上直接跳过
    }
  }
  return r;
}
// 高精输出
void write(N a) {
  for (int i = 100, j = 0; i > 0; i--, j++) {
    if (j == 10) puts(""), j = 0; // 50 位换行
    printf("%05lld", a.v[i]);
  }
}
// 快速幂
N qpow(N a, ll b) {
  N r = {{1, 1}};
  while (b) {
    if (b & 1) r = r * a;
    a = a * a, b >>= 1;
  }
  return r;
}
int main(void) {
  ll p;
  cin >> p;
  cout << ceil(p * log10(2)) << endl;
  N a = {{1, 2}};
  a = qpow(a, p);
  a.v[1]--;
  write(a);
  return 0;
}

by hzx198 @ 2024-03-21 20:55:13

dd


|