全RE求助
查看原帖
全RE求助
376161
Phartial啊?楼主2021/6/13 16:00

rt,样例过了但却全re了

评测记录

代码:

// 快速傅里叶变换 (FFT)
#include <iostream>
#include <cmath>

using namespace std;

const double kPi = 3.1415926535897932;
const int kMaxN = 2e6;

struct C {
  double r, i;

  const C &operator+(const C &o) const {
    return {r + o.r, i + o.i};
  }

  const C &operator-(const C &o) const {
    return {r - o.r, i - o.i};
  }

  const C &operator*(const C &o) const {
    return {r * o.r - i * o.i, r * o.i + o.r * i};
  }
} a[kMaxN], b[kMaxN];

int n, m, l[2] = {1}, r[kMaxN];

void FFT(C a[], int t) {
  for (int i = 0; i < l[0]; ++i) {
    if (i < r[i]) {
      swap(a[i], a[r[i]]);
    }
  }
  for (int i = 1; i < l[0]; i <<= 1) {
    C o = {cos(kPi / i), t * sin(kPi / i)};
    for (int j = 0; j < l[0]; j += i << 1) {
      C w = {1, 0};
      for (int k = 0; k < i; ++k, w = w * o) {
        C x = a[j + k], y = w * a[i + j + k];
        a[j + k] = x + y, a[i + j + k] = x - y;
      }
    }
  }
}

int main() {
  cin >> n >> m;
  for (int i = 0; i <= n; ++i) {
    cin >> a[i].r;
  }
  for (int i = 0; i <= m; ++i) {
    cin >> b[i].r;
  }
  for (; l[0] <= n + m; l[0] <<= 1, ++l[1]) {
  }
  for (int i = 0; i < l[0]; ++i) {
    r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l[1] - 1));
  }
  FFT(a, 1), FFT(b, 1);
  for (int i = 0; i <= l[0]; ++i) {
    a[i] = a[i] * b[i];
  }
  FFT(a, -1);
  for (int i = 0; i <= n + m; ++i) {
    cout << int(a[i].r / l[0] + 0.5) << " ";
  }
  return 0;
}
2021/6/13 16:00
加载中...