FFT快速傅里叶模板……


/*	use way:
		assign : h(x) = f(x) * g(x)  f(x):len1  g(x):len2
		1.  len = 1;  while(len < 2 * len1 || len < 2 * len2) len <<= 1;  
		2.  for i=0 to len1-1 : x1[i](f(i),0)  for i=len1 to len-1 : x1[i](0.0)   g(x) is same.....
		3.  fft(x1,len,1) fft(x2,len,1)
		4.  for i=0 to len-1 : x1[i] = x1[i] * x2[i]
		5.  fft(x1,len,-1)
		6.  ans[i] = (long long)(x[i].a + 0.5)
		ps : goback should from len1 + len2 - 1 ,but not len !  I don't know why.....
*/


#include <vector>
#include <list>
#include <map>
#include <set>
#include <stack>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>

using namespace std;

const double pi = atan(1.0) * 4;

struct complex {
	double a, b;
	complex(double aa = 0.0, double bb = 0.0) { a = aa; b = bb; }
	complex operator +(const complex &e) { return complex(a + e.a, b + e.b); }
	complex operator -(const complex &e) { return complex(a - e.a, b - e.b); }
	complex operator *(const complex &e) { return complex(a * e.a - b * e.b, a * e.b + b * e.a); }
};

void change(complex * y, long long len) {
	long long i, j, k;
	for (i = 1, j = len / 2; i < len - 1; i++) {
		if (i < j) swap(y[i], y[j]);
		k = len / 2;
		while (j >= k) {
			j -= k;
			k /= 2;
		}
		if (j < k) j += k;
	}
}

void fft(complex *y, long long len, long long on) {
	change(y, len);
	for (int h = 2; h <= len; h <<= 1) {
		complex wn(cos(-on * 2 * pi / h), sin(-on * 2 * pi / h));
		for (int j = 0; j < len; j += h) {
			complex w(1, 0);
			for (int k = j; k < j + h / 2; k++) {
				complex u = y[k];
				complex t = w * y[k + h / 2];
				y[k] = u + t;
				y[k + h / 2] = u - t;
				w = w * wn;
			}
		}
	}
	if (on == -1)
		for (int i = 0; i < len; i++)
			y[i].a /= len;
}

int main(){
	return 0;
}