首页 > 其他 > 详细

快速傅里叶变换模板

时间:2019-10-30 10:24:17      阅读:70      评论:0      收藏:0      [点我收藏+]

模板题

看了很久, 还是不太懂 $fft$ 的原理orz, 但是也还好, 反正再难也是一个分治而已, 不用怕

存个板子, 以后肯定也还会用的到.

希望下次来的时候我已经懂了233

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <complex>
#include <math.h>
#define MAXN 3000010
#define cp complex<double>
using namespace std;
const double PI=acos(-1.0);
int n,m,rev[MAXN],lim=1,bit;
cp a[MAXN],b[MAXN];

int read(){
    int x=0,f=1;char c=getchar();
    while(c<0||c>9) {if(c==-)f=-1;c=getchar();}
    while(c>=0&&c<=9) {x=x*10+c-0;c=getchar();}
    return x*f;
}

void FFT(cp *a,int inv){
    for(int i=0;i<lim;i++)
        if(i<rev[i]) swap(a[i],a[rev[i]]);
    for(int mid=1;mid<lim;mid<<=1){
        cp wn(cos(PI/mid),inv*sin(PI/mid));
        for(int i=0;i<lim;i+=mid*2){
            cp w(1,0);
            for(int j=0;j<mid;j++,w*=wn){
                cp x=a[i+j],y=w*a[i+j+mid];
                a[i+j]=x+y,a[i+j+mid]=x-y;
            }
        }
    }
}

int main(){
    n=read();m=read();
    for(int i=0;i<=n;i++) a[i].real(read());
    for(int i=0;i<=m;i++) b[i].real(read());
    while(lim<=m+n) lim<<=1,bit++;
    for(int i=0;i<lim;i++) rev[i]=(rev[i>>1]>>1) | ((i&1)<<(bit-1));
    FFT(a,1);FFT(b,1);
    for(int i=0;i<=lim;i++) a[i]*=b[i];
    FFT(a,-1);
    for(int i=0;i<=n+m;i++) printf("%d ",(int)(a[i].real()/lim+0.5));
    return 0;
}

 

快速傅里叶变换模板

原文:https://www.cnblogs.com/BakaCirno/p/11762594.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!