zoukankan      html  css  js  c++  java
  • 快速傅里叶变换模板

    模板题

    看了很久, 还是不太懂 $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;
    }
  • 相关阅读:
    flask url_for后没有带端口号
    [Flask]通过render_form快捷渲染表单
    [Flask]使用sqlite数据库
    jmeter参数化读取数据进行多次运行
    eclipse 集成jdk
    创建一个gradle项目
    gradle的安装
    springmvc--jsp页面乱码
    APP专项测试使用到的工具
    robotframework实战三--自定义关键字
  • 原文地址:https://www.cnblogs.com/BakaCirno/p/11762594.html
Copyright © 2011-2022 走看看