FFT

#include <bits/stdc++.h>
#define sc(x) scanf("%lld", &(x))
#define pr(x) printf("%lld\n", x)
#define endl '\n'
#define mem(x, y) memset(x, y, sizeof(x))
#define ios ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define pt putchar(10)
#define For(i, j, k) for (int i = (int)(j); i <= (int)(k); i++)
#define Rep(i, j, k) for (int i = (int)(j); i >= (int)(k); i--)
using namespace std;
typedef long long ll;
const int N = 1e6 + 7;
const ll mod = 1e9 + 7;
const double PI = acos(-1);
const int INF = 0x3f3f3f3f;
struct Complex {
    double r, i;
    Complex(double _r = 0, double _i = 0) {
        r = _r;
        i = _i;
    }
    Complex operator+(const Complex &b) { return Complex(r + b.r, i + b.i); }
    Complex operator-(const Complex &b) { return Complex(r - b.r, i - b.i); }
    Complex operator*(const Complex &b) {
        return Complex(r * b.r - i * b.i, r * b.i + i * b.r);
    }
    Complex operator/(const Complex &b) {
        ll d = (b.r * b.r + b.i * b.i);
        return ((r * b.r + i * b.i) / d, (i * b.r + r * b.i) / d);
    }
};
void change(Complex *y, int len) {
    int i, j, k;
    for (i = 1, j = len / 2; i < len - 1; i++) {
        if (i < j)
            swap(y[i], y[j]);
        k = len / 2;
        while (j >= k) {
            j -= k;
            k /= 2;
        }
        if (j < k)
            j += k;
    }
}
void fft(Complex *y, int len, int on) {
    change(y, len);
    for (int h = 2; h <= len; h <<= 1) {
        Complex wn(cos(-on * 2 * PI / h), sin(-on * 2 * PI / h));
        for (int j = 0; j < len; j += h) {
            Complex w(1, 0);
            for (int k = j; k < j + h / 2; k++) {
                Complex u = y[k];
                Complex t = w * y[k + h / 2];
                y[k] = u + t;
                y[k + h / 2] = u - t;
                w = w * wn;
            }
        }
    }
    if (on == -1)
        for (int i = 0; i < len; i++)
            y[i].r /= len;
}
Complex x1[N << 2];
Complex x2[N << 2];
int n, m, a[N], b[N];
int num[N << 1];
int main(void) {
    scanf("%d%d", &n, &m);
    for (int i = 0; i <= n; i++)
        scanf("%d", &a[i]);
    for (int i = 0; i <= m; i++)
        scanf("%d", &b[i]);
    int len, len1;
    // len1=n+m+1;
    len = 1;
    while (len < ((n + 1) << 1) || len < ((m + 1) << 1))
        len <<= 1;
    for (int i = 0; i <= n; i++)
        x1[i] = Complex(a[i], 0);
    for (int i = n + 1; i < len; i++)
        x1[i] = Complex(0, 0);
    for (int i = 0; i <= m; i++)
        x2[i] = Complex(b[i], 0);
    for (int i = m + 1; i < len; i++)
        x2[i] = Complex(0, 0);
    fft(x1, len, 1);
    fft(x2, len, 1);
    for (int i = 0; i < len; i++)
        x1[i] = (x1[i] * x2[i]);
    fft(x1, len, -1);
    for (int i = 0; i <= n + m; i++)
        num[i] = (x1[i].r + 0.5);
    for (int i = 0; i <= n + m; i++)
        printf("%d%c", num[i], i == n + m ? '\n' : ' ');
    return 0;
}
全部评论

相关推荐

点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-26 16:06
已编辑
快手电商 后端 23k-35k
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务