2194: 快速傅立叶之二|快速傅里叶变换

来源:互联网 发布:淘宝金酷娃玩具 编辑:程序博客网 时间:2024/05/22 00:08

很容易发现就是把b序列反过来直接FFT搞一下

#include<algorithm>#include<iostream>#include<complex>#include<cstdlib>#include<cstring>#include<cstdio>#include<vector>#include<queue>#include<ctime>#include<cmath>#include<map>#include<set>#define N 266333using namespace std;typedef complex<double> E;const double pi=acos(-1);int m,n,L,R[N],w[N];E a[N],b[N];void FFT(E *a,int f){    for(int i=0;i<n;i++)if(i<R[i])swap(a[i],a[R[i]]);    for(int i=1;i<n;i<<=1)    {        E wn(cos(pi/i),f*sin(pi/i));        for(int k=0;k<n;k+=(i<<1))        {            E w(1,0);            for(int j=0;j<i;j++,w*=wn)            {                E x=a[j+k],y=w*a[j+k+i];                a[j+k]=x+y,a[j+k+i]=x-y;            }        }    }    if(f==-1)for(int i=0;i<n;i++)a[i]/=n;}int main(){    scanf("%d",&m);    for(int i=0,x,y;i<m;i++)        scanf("%d%d",&x,&y),a[i]=x,b[m-i-1]=y;    m*=2;for(n=2;n<m;n<<=1)L++;    for(int i=1;i<n;i++)R[i]=(R[i>>1]>>1)|((i&1)<<L);    FFT(a,1);FFT(b,1);    for(int i=0;i<n;i++)a[i]*=b[i];    FFT(a,-1);    for(int i=m/2-1;i<=m-2;i++)        printf("%d\n",(int)(a[i].real()+0.1));    return 0;}
0 0