Advertisement
Guest User

VFMUL

a guest
May 9th, 2011
369
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.14 KB | None | 0 0
  1. #define _CRT_SECURE_NO_DEPRECATE
  2. #include <algorithm>
  3. #include <string>
  4. #include <set>
  5. #include <map>
  6. #include <vector>
  7. #include <queue>
  8. #include <iostream>
  9. #include <iterator>
  10. #include <cmath>
  11. #include <cstdio>
  12. #include <cstdlib>
  13. #include <sstream>
  14. #include <fstream>
  15. #include <ctime>
  16. #include <cstring>
  17. #pragma comment(linker, "/STACK:16777216")
  18. using namespace std;
  19. #define pb push_back
  20. #define ppb pop_back
  21. #define pi 3.1415926535897932384626433832795028841971
  22. #define mp make_pair
  23. #define x first
  24. #define y second
  25. #define pii pair<int,int>
  26. #define pddd pair<double,double>
  27. #define INF 1000000000
  28. #define FOR(i,a,b) for (int _n(b), i(a); i <= _n; i++)
  29. #define FORD(i,a,b) for(int i=(a),_b=(b);i>=_b;i--)
  30. #define all(c) (c).begin(), (c).end()
  31. #define SORT(c) sort(all(c))
  32. #define rep(i,n) FOR(i,1,(n))
  33. #define rept(i,n) FOR(i,0,(n)-1)
  34. #define L(s) (int)((s).size())
  35. #define C(a) memset((a),0,sizeof(a))
  36. #define VI vector <int>
  37. #define ll long long
  38.  
  39. int a,b,c,d,i,j,n,m,k,kolt,l1,l2;
  40. char s1[300001],s2[300001],str[700001];
  41. struct pdd
  42. {
  43.    double x,y;
  44.    pdd():x(0),y(0) {}
  45.    pdd(double _x,double _y):x(_x),y(_y) {}
  46. };
  47. inline pdd operator +(const pdd &a,const pdd &b)
  48. {
  49.    return pdd(a.x+b.x,a.y+b.y);
  50. }
  51. inline pdd operator -(const pdd &a,const pdd &b)
  52. {
  53.    return pdd(a.x-b.x,a.y-b.y);
  54. }
  55. inline pdd operator *(const pdd &a,const pdd &b)
  56. {
  57.    return pdd(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);
  58. }
  59. inline pdd operator /(const pdd &a,const double &b)
  60. {
  61.    return pdd(a.x/b,a.y/b);
  62. }
  63. inline pdd conj(const pdd &a)
  64. {
  65.    return pdd(a.x,-a.y);
  66. }
  67. int SN=-1;
  68. int rv[1<<18];
  69. pdd w[1<<18];
  70.  
  71. void fft(pdd *a,int n,bool inv)
  72. {
  73.    int cc=0;
  74.    rept(i,30) if (n&1<<i) cc=i;
  75.    if (cc!=SN)
  76.    {
  77.        SN=cc;
  78.        rv[0]=0; rv[1]=1;
  79.        rep(st,SN-1)
  80.        {
  81.            int k=1<<st;
  82.            rept(i,k)
  83.            {
  84.                rv[i+(1<<st)]=rv[i]*2+1;
  85.                rv[i]*=2;
  86.            }
  87.        }
  88.        rept(i,1<<SN) w[i]=pdd(cos(2.0*pi*i/n),sin(2.0*pi*i/n));
  89.    }
  90.    rept(i,n) if (rv[i]<=i) swap(a[i],a[rv[i]]);
  91.    for (int st=2;st<=n;st*=2)
  92.    {
  93.        int d=n/st,o=st/2;
  94.        for (int i=0;i<n;i+=st)
  95.        {
  96.            for (int j=0;j<o;++j)
  97.            {
  98.                pdd u=a[i+j],v=a[i+j+o]*(inv?conj(w[j*d]):w[j*d]);
  99.                a[i+j]=u+v;
  100.                a[i+j+o]=u-v;
  101.            }
  102.        }
  103.    }
  104.    if (inv) rept(i,n) a[i]=a[i]/n;
  105. }
  106.  
  107. pdd a1[1<<18],a2[1<<18];
  108. ll ans[(1<<18)+10];
  109.  
  110. int main()
  111. {
  112. //    freopen("input.txt","r",stdin);
  113. //    freopen("output.txt","w",stdout);
  114.  
  115.    gets(str); sscanf(str,"%d",&kolt);
  116.    rep(hod,kolt)
  117.    {
  118.        gets(str);
  119.        l1=0; l2=0; a=0;
  120.        while (str[a]>='0' && str[a]<='9') s1[l1++]=str[a++];
  121.        while (str[a]<'0' || str[a]>'9') ++a;
  122.        while (str[a]>='0' && str[a]<='9') s2[l2++]=str[a++];
  123.        s1[l1]=s2[l2]=0;
  124.  
  125.        d=max(l1,l2)/3+1;
  126.        m=1; while (m<d) m*=2; m*=2;
  127.        memset(a1,0,(m+1)*sizeof(pdd)); memset(a2,0,(m+1)*sizeof(pdd));
  128.        b=0;
  129.        for (int i=l1-1;i>=0;i-=3)
  130.        {
  131.            a=0;
  132.            for (int j=i-2;j<=i;++j)
  133.            {
  134.                if (j<0) continue;
  135.                a=a*10+s1[j]-'0';
  136.            }
  137.            a1[b++]=pdd(a,0);
  138.        }
  139.  
  140.        c=0;
  141.        for (int i=l2-1;i>=0;i-=3)
  142.        {
  143.            a=0;
  144.            for (int j=i-2;j<=i;++j)
  145.            {
  146.                if (j<0) continue;
  147.                a=a*10+s2[j]-'0';
  148.            }
  149.            a2[c++]=pdd(a,0);
  150.        }
  151.        c=max(c,b);
  152.        n=1;
  153.        while (n<c) n*=2;
  154.        n*=2;
  155.  
  156.        fft(a1,n,0);
  157.        fft(a2,n,0);
  158.        rept(i,n) a1[i]=a1[i]*a2[i];
  159.        fft(a1,n,1);
  160.        
  161.        ans[0]=0;
  162.        for (int i=0;i<n;++i)
  163.        {
  164.            ans[i+1]=0;
  165.            ans[i]+=(ll)(a1[i].x+0.5);
  166.            ans[i+1]+=ans[i]/1000;
  167.            ans[i]%=1000;
  168.        }
  169.        while (ans[n])
  170.        {
  171.            ans[n+1]=ans[n]/1000;
  172.            ans[n]%=1000;
  173.            ++n;
  174.        }
  175.        while (n>1 && ans[n-1]==0) --n;
  176.  
  177.        FORD(i,n-1,0)
  178.        {
  179.            if (i==n-1) printf("%d",(int)ans[i]); else
  180.            printf("%03d",(int)ans[i]);
  181.        }
  182.        printf("\n");
  183.    }
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement