# BZOJ2194. 快速傅立叶之二

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
{
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=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
return x*f;
}
const int N=4e5+7;
const double pi=acos(-1.0);
struct CP {
double x,y;
CP (double xx=0,double yy=0) { x=xx,y=yy; }
inline CP operator + (const CP &tmp) const {
return CP(x+tmp.x,y+tmp.y);
}
inline CP operator - (const CP &tmp) const {
return CP(x-tmp.x,y-tmp.y);
}
inline CP operator * (const CP &tmp) const {
return CP(x*tmp.x-y*tmp.y,x*tmp.y+y*tmp.x);
}
}A[N],D[N];
int n,p[N];
void FFT(CP *A,int len,int type)
{
for(int i=0;i<len;i++) if(i<p[i]) swap(A[i],A[p[i]]);
for(int mid=1;mid<len;mid<<=1)
{
CP wn(cos(pi/mid),type*sin(pi/mid));
for(int R=mid<<1,j=0;j<len;j+=R)
{
CP w(1,0);
for(int k=0;k<mid;k++,w=w*wn)
{
CP x=A[j+k],y=w*A[j+mid+k];
A[j+k]=x+y;
A[j+mid+k]=x-y;
}
}
}
}
int main()
{
}