fft模板
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <algorithm> 3 #include <cmath> 4 #include <complex> 5 using namespace std; 6 const int N = 4e6 + 5; 7 const double pi = acos(-1); 8 typedef complex<double> cd; 9 int n, m, l, r[N]; 10 cd a[N], b[N]; 11 void fft(cd *c, int type){ 12 for(int i = 0; i < n; i++) 13 if(i < r[i]) swap(c[i], c[r[i]]); 14 for(int i = 1; i < n; i <<= 1){ 15 cd x(cos(pi / i), type * sin(pi / i)); 16 for(int j = 0; j < n; j += (i << 1)){ 17 cd y(1, 0); 18 for(int k = 0; k < i; k++, y *= x){ 19 cd p = c[j + k], q = y * c[i + j + k]; 20 c[j + k] = p + q, c[i + j + k] = p - q; 21 } 22 } 23 } 24 } 25 26 inline void init(){ 27 scanf("%d %d", &n, &m); 28 for(int i = 0; i <= n; i++) { 29 int x; scanf("%d", &x); 30 a[i] = x; 31 } 32 for(int i = 0; i <= m; i++) { 33 int x; scanf("%d", &x); 34 b[i] = x; 35 } 36 for(m += n, n = 1; n <= m; n <<= 1) l++; 37 } 38 39 inline void cal(){ 40 for(int i = 0; i < n; i++) 41 r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1)); 42 } 43 44 int main(){ 45 init(); 46 cal(); 47 fft(a, 1); fft(b, 1); 48 for(int i = 0; i <= n; i++) a[i] *= b[i]; 49 fft(a, -1); 50 for(int i = 0; i <= m; i++) 51 printf("%d ", (int)(a[i].real() / n + 0.5)); 52 return 0; 53 }