Morass

Karatsuba

Jul 24th, 2016
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.67 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,sizeof(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<<16)
  25. #define MD(C,B) ((C)>=0?(C)%(B):((B)-(-(C))%(B))%B)
  26. ll tt,N,a[MX],b[MX],c[MX];
  27. void kal(ll *a,ll *b,ll L,ll *c,ll *v,ll *w,ll h,ll m){
  28.     if(h>=m)return;
  29.     if(L<=8){
  30.         F(L)FF(L)c[i+j]+=a[i]*b[j];
  31.         return;
  32.     }
  33.     ll d(L>>1),*A=v,*B=w;
  34.     v=v+L,w=w+L;
  35.     F(L)A[i]=B[i]=0;
  36.     kal(a,b,d,A,v,w,h,m);
  37.     kal(a+d,b+d,d,B,v,w,h+d,m);
  38.     F(L)c[i]+=A[i],c[i+L]+=B[i],c[i+d]-=A[i]+B[i];
  39.     F(d)A[i]=a[i]+a[i+d],B[i]=b[i]+b[i+d];
  40.     kal(A,B,d,c+d,v,w,h,m);
  41. }
  42. ll kar(ll *a,ll A,ll *b,ll B,ll *c){
  43.     static ll V[MX],W[MX];
  44.     ll l(max(A,B)),N(1);
  45.     while(N<l)N<<=1;
  46.     FT(A,N)a[k]=0;
  47.     FT(B,N)b[k]=0;
  48.     F(N<<1)c[i]=0;
  49.     kal(a,b,N,c,V,W,0,min(A,B));
  50.     return (A+B)-1;
  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(kar(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