atulshanbhag

polymul.cpp

Jul 14th, 2016
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.29 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define NMAX 100006
  3. using namespace std;
  4.  
  5. typedef complex<double> Complex;
  6. typedef valarray<Complex> CArray;
  7.  
  8. const double pi = acos(-1);
  9. int test, n, next_power_2;
  10. Complex a[NMAX], b[NMAX], z;
  11. CArray A, B;
  12.  
  13. void fft(CArray &X, int N, bool inv) {
  14.  
  15.     if(N <= 1)
  16.         return ;
  17.  
  18.     Complex w = 1, wn = polar(1.0, 2*pi/N);
  19.     if(inv)
  20.         wn = polar(1.0, -2*pi/N);
  21.  
  22.     CArray even = X[slice(0, N/2, 2)], odd = X[slice(1, N/2, 2)];
  23.  
  24.     fft(even, N/2, inv);
  25.     fft(odd, N/2, inv);
  26.  
  27.     for(size_t k=0;k<N/2;k++) {
  28.         z = w*odd[k];
  29.         X[k] = even[k] + z;
  30.         X[k+N/2] = even[k] - z;
  31.         w *= wn;
  32.     }
  33. }
  34.  
  35. void poly_mul(CArray &X, CArray &Y, int N, bool inv) {
  36.     fft(X, N, inv);
  37.     fft(Y, N, inv);
  38.  
  39.     X *= Y;
  40.  
  41.     fft(X, N, !inv);
  42.     X /= N;
  43. }
  44.  
  45. void solve() {
  46.  
  47.     scanf("%d",&n);
  48.     n += 1;
  49.  
  50.     memset(a, 0, sizeof(a));
  51.     memset(b, 0, sizeof(b));
  52.  
  53.     for(size_t i=0;i<n;i++)
  54.         scanf("%lf",&a[i]);
  55.     for(size_t j=0;j<n;j++)
  56.         scanf("%lf",&b[j]);
  57.  
  58.     next_power_2 = 1;
  59.     while(next_power_2 < n)
  60.         next_power_2 <<= 1;
  61.  
  62.     A = CArray(a, 2*next_power_2);
  63.     B = CArray(b, 2*next_power_2);
  64.  
  65.     poly_mul(A, B, 2*next_power_2, false);
  66.  
  67.     for(size_t i=0;i<2*n-1;i++)
  68.         printf("%.0f ",real(A[i]));
  69.     printf("\n");
  70.  
  71. }
  72.  
  73. int main() {
  74.    
  75.     scanf("%d",&test);
  76.  
  77.     while(test--)
  78.         solve();
  79.  
  80.     return 0;
  81. }
Add Comment
Please, Sign In to add comment