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;
}