Advertisement
Morass

FFT

Jul 24th, 2016
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.88 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define PB push_back
  4. #define ZERO (1e-10)
  5. #define INF (1<<30)
  6. #define LINF (1LL<<60)
  7. #define NINF -INF
  8. #define CL(A,I) (memset(A,I,nof(A)))
  9. #define add(A,B) (g[A].PB(B),g[B].PB(A))
  10. #define ADD(A,B,V) (add(A,B),v[A].PB(V),v[B].PB(V))
  11. #define DEB printf("DEB!\n");
  12. #define D(X) cout<<"  "<<#X": "<<X<<endl;
  13. #define EQ(A,B) (A+ZERO>B&&A-ZERO<B)
  14. typedef long long ll;
  15. typedef pair<ll,ll> pll;
  16. typedef vector<int> vi;
  17. typedef pair<int,int> ii;
  18. #define REP(i, n) for (int i = 0; i < n; i++)
  19. #define F(W) REP(i,W)
  20. #define FF(W) REP(j,W)
  21. #define FT(I,W) for(int k(I);k<W;++k)
  22. #define IN(n) int n; cin >> n;
  23. #define PR(A,X) (X?A.second:A.first)
  24. #define MX (1<<17)
  25. #define MD(C,B) ((C)>=0?(C)%(B):((B)-(-(C))%(B))%B)
  26. ll tt,N,a[MX],b[MX],c[MX];
  27. typedef std::complex<double> cpx;
  28. void dft(const cpx *s,cpx *r,int n,const cpx &wn,cpx *h){
  29.     if(n==1){*r=*s;return;}
  30.     int N=n>>1,j(-2),k(-1);;
  31.     cpx *os=h,*es=h+N,*oR=h+2*N,*eR=h+3*N;
  32.     F(N)es[i]=s[j+=2],os[i]=s[k+=2];
  33.     cpx w(1,0),t(wn*wn);
  34.     dft(es,eR,N,t,h+4*N),dft(os,oR,N,t,h+4*N);
  35.     F(N)t=w*oR[i],r[i]=eR[i]+t,r[i+N]=eR[i]-t,w=wn*w;
  36. }
  37. int fft(ll *f,int A,ll *s,int B,ll *r){
  38.     static cpx ra[MX],b[MX],a[MX],rb[MX],tr[MX],wn,o[(MX)<<2];
  39.     int N(1),h(max(A,B)*2-1),H(A+B-1);
  40.     while(N<=h)N<<=1;
  41.     F(N)a[i]=b[i]=ra[i]=rb[i]=tr[i]={0,0};
  42.     F(A)a[i].real(f[i]);
  43.     F(B)b[i].real(s[i]);
  44.     wn={cos(2*M_PI/N),sin(2*M_PI/N)};
  45.     dft(a,ra,N,wn,o),dft(b,rb,N,wn,o);
  46.     F(N)tr[i]=ra[i]*rb[i];
  47.     dft(tr,rb,N,pow(wn,-1),o);
  48.     F(N)rb[i].real(rb[i].real()/N);
  49.     F(H)r[i]=(ll)(rb[i].real()+0.5);
  50.     return H;
  51. }
  52. int main(void){
  53.     for(scanf("%lld",&tt);tt--;){
  54.         scanf("%lld",&N);++N;
  55.         F(N)scanf("%lld",a+i);
  56.         F(N)scanf("%lld",b+i);
  57.         ll h(fft(a,N,b,N,c));
  58.         F(h)printf("%lld%c",c[i],i+1==h?'\n':' ');
  59.     }
  60.     return 0;
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement