#include #define PI 3.141592653589793238 using namespace std; template void fft2(complex *array,int size_log_2,bool positive) { complex swap; for (int i=0;i<(1<>j<i) { swap=array[reverse]; array[reverse]=array[i]; array[i]=swap; } } complex ca,cb; for (int s=0;s w=exp(complex(0,(positive?-1:1)*PI/(1< m=1; for (int b=0;b<(1< int fft(complex *array,int size,bool positive,int step=1) { int N1,N2,m1,m2,k1,k2; if (step==1) { int inter=size; while (true) { if (inter%2==0) inter=inter/2; else if (inter%3==0) inter=inter/3; else if (inter%5==0) inter=inter/5; else if (inter%7==0) inter=inter/7; else break; } if (inter!=1) return -1; } if (size%2==0) N1=2; else if (size%3==0) N1=3; else if (size%5==0) N1=5; else if (size%7==0) N1=7; else if (size==1) return 0; else return -1; N2=size/N1; complex log_w=complex(0,(positive?-1:1)*2*PI/size); complex log_w1=complex(0,(positive?-1:1)*2*PI/N1); if (N2>1) for (m1=0;m1(array+m1*step,N2,positive,N1*step); for (k2=0;k2 *array_=new complex[size]; complex *ar=new complex[N1]; for (k2=0;k2