码迷,mamicode.com
首页 > 其他好文 > 详细

FFT 模板

时间:2016-06-01 21:22:36      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

#include<bits/stdc++.h>
#define ll long long
#define N 600005
using namespace std;
inline int read(){
  int x=0,f=1;char ch=getchar();
  while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}
  while(ch>=0&&ch<=9){x=10*x+ch-0;ch=getchar();}
  return x*f;
}
struct CD{
  double x,y;
  CD(double a=0,double b=0){x=a,y=b;}
  friend CD operator + (CD n1,CD n2){return CD(n1.x+n2.x,n1.y+n2.y);}
  friend CD operator - (CD n1,CD n2){return CD(n1.x-n2.x,n1.y-n2.y);}
  friend CD operator * (CD n1,CD n2){return CD(n1.x*n2.x-n1.y*n2.y,n1.x*n2.y+n1.y*n2.x);}
};
const double Pi=acos(-1.0);
int bit,n,m,nn;
CD a[N],b[N];
void FFT(CD *a,int n,int type){
  for(int i=0,j=0;i<n;i++) {
    if(j>i)swap(a[i],a[j]);
    int k=n;
    while(j&(k >>= 1))j&=~k;
    j|=k;
  }
  for(int i=1;i<=bit;i++){
    CD w_n(cos(2*type*Pi/(1<<i)),sin(2*type*Pi/(1<<i)));
    for(int j=0;j<n;j+=(1<<i)){
      CD w(1,0);
      for(int k=j;k<j+(1<<(i-1));k++){
        CD tmp=a[k],tt=w*a[k+(1<<(i-1))];
        a[k]=tmp+tt;
        a[k+(1<<(i-1))]=tmp-tt;
        w=w*w_n;
      }
    }
  }
  if(type<0)for(int i=0;i<n;i++)a[i].x/=n;
}
int main(){
  n=read();m=read();n++;m++;
  for(int i=0;i<n;i++)scanf("%lf",&a[i].x),a[i].y=0.0;
  for(int i=0;i<m;i++)scanf("%lf",&b[i].x),b[i].y=0.0;
  bit=1;
  while((1<<bit)<(n+m-1))bit++;
  nn=1<<bit;
  for(int i=n;i<nn;i++)a[i]=CD(0.0,0.0);
  for(int i=m;i<nn;i++)b[i]=CD(0.0,0.0);
  
  FFT(a,nn,1);FFT(b,nn,1);
  for(int i=0;i<nn;i++)a[i]=a[i]*b[i];
  FFT(a,nn,-1);
  
  for(int i=0;i<(n+m-1);i++)printf("%d ",(int)(a[i].x+0.5));
  return 0;
}

 

FFT 模板

标签:

原文地址:http://www.cnblogs.com/wjyi/p/5550993.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!