博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Power oj 2540 (FFT卷积)
阅读量:1905 次
发布时间:2019-04-26

本文共 2144 字,大约阅读时间需要 7 分钟。

题目链接:https://www.oj.swust.edu.cn/problem/show/2540

代码:

#include<bits/stdc++.h>

using namespace std;
const int FFT_MAXN = 1 << 18;
const double pi = acos(-1.0);
struct Complex
{
    double R, I;
    inline Complex(double real = 0.0, double image = 0.0)
    {
        R = real, I = image;
    }
    inline Complex operator + (Complex const &b) const
    {
        return Complex(R + b.R, I + b.I);
    }
    inline Complex operator - (Complex const &b) const
    {
        return Complex(R - b.R, I - b.I);
    }
    inline Complex operator * (Complex const &b) const
    {
        return Complex(R * b.R - I * b.I, I * b.R + R * b.I);
    }
} Wn[FFT_MAXN + 1];
int bitrev[FFT_MAXN];
inline int getLength(int n, int m)
{
    n = n + m - 1;
    int i = 1;
    for(; i < n; i <<= 1);
    return i;
}
void Change(Complex a[], int n)
{
    int d = 0;
    while((1 << d)*n != FFT_MAXN)
        d++;
    for(int i = 0; i < n; i++)
        if(i < (bitrev[i] >> d))
            swap(a[i], a[bitrev[i] >> d]);
}
void FFT(Complex P[], int n, int op)
{
    Change(P, n);
    for(int len = 2; len <= n; len <<= 1)
    {
        int m = len >> 1;
        int del = FFT_MAXN / len * op;
        for(int i = 0; i < n; i += len)
        {
            Complex *p = P + i, *q = P + i + m, *w = op == 1 ? Wn : Wn + FFT_MAXN;
            for(int j = 0; j < m; j++, p++, q++, w += del)
            {
                Complex ne = *q * *w;
                *q = *p - ne;
                *p = *p + ne;
            }
        }
    }
    if(op == -1)
        for(int i = 0; i < n; i++)
        {
            P[i].R /= n;
            P[i].I /= n;
        }
}
void FFTInit()
{
    int L = 0;
    while((1 << L) != FFT_MAXN)
        L++;
    bitrev[0] = 0;
    for(int i = 1; i < FFT_MAXN; i++)
        bitrev[i] = bitrev[i >> 1] >> 1 | ((i & 1) << (L - 1));
    for(int i = 0; i <= FFT_MAXN; i++)
        Wn[i] = Complex(cos(2 * pi / FFT_MAXN * i), sin(2 * pi / FFT_MAXN * i));
}
Complex A[FFT_MAXN], B[FFT_MAXN];
int main()
{
    FFTInit();
    int n, m;
    scanf("%d%d", &n, &m);
    int N = getLength(n, m);
    for(int i = 0; i < N; i++)
    {
        if(i < n)
        {
            int x;
            scanf("%d", &x);
            A[i] = Complex(x, 0);
        }
        else A[i] = Complex();
    }
    for(int i = 0; i < N; i++)
    {
        if(i < m)
        {
            int y;
            scanf("%d", &y);
            B[i] = Complex(y, 0);
        }
        else B[i] = Complex();
    }
    FFT(A, N, 1);
    FFT(B, N, 1);
    for(int i = 0; i < N; i++)
        A[i] = A[i] * B[i];
    FFT(A, N, -1);
    for(int i = 0; i <= n + m - 2; i++)
    {
        if(i == 0) printf("%d", (int)(A[i].R+0.5 ));
        else printf(" %d", (int)(A[i].R+0.5));
    }
    printf("\n");
    return 0;
}

 

 

 

转载地址:http://vincf.baihongyu.com/

你可能感兴趣的文章
iconv 文件编码转换
查看>>
QLineEdit设置ip输入规则
查看>>
Linux串口编程
查看>>
交互设计专业书籍推荐(内有部分书籍电子版下载)
查看>>
strcasestr函数
查看>>
h264 ES流文件通过计算first_mb_in_slice区分帧边界
查看>>
设置系统时间
查看>>
C++模板学习和C++ 模板套模板
查看>>
合 JSONP 和 jQuery 快速构建强大的 mashup
查看>>
自制基于地图的 mashup
查看>>
成为优秀程序员的十个有效方法
查看>>
Oracle计算时间差函数
查看>>
Linux开机启动十步骤
查看>>
source insight 字体设置
查看>>
Live555中RTP包的打包与发送过程分析
查看>>
TCP和UDP 协议发送数据包的大小
查看>>
用vlc搭建简单流媒体服务器(UDP和TCP方式)
查看>>
RTSP流媒体数据传输的两种方式(TCP和UDP)
查看>>
Q_DECLARE_METATYPE与qRegisterMetaType学习
查看>>
国外程序员推荐:每个程序员都应读的书
查看>>