Advertisement
RaFiN_

multiply two big number using FFT

Sep 27th, 2019
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.44 KB | None | 0 0
  1. /*multiply two big number using FFT */
  2.   typedef complex < double > base ;
  3.   const double PI = 2*acos( 0.0 );
  4.  
  5. void fft ( vector < base > & a, bool invert ) {
  6.     int n = ( int ) a. size ( ) ;
  7.  
  8.     for ( int i = 1 , j = 0 ; i < n ; ++ i ) {
  9.         int bit = n >> 1 ;
  10.         for ( ; j >= bit ; bit >>= 1 )
  11.             j -= bit ;
  12.         j += bit ;
  13.         if ( i < j )
  14.             swap ( a [ i ] , a [ j ] ) ;
  15.     }
  16.  
  17.     for ( int len = 2 ; len <= n ; len <<= 1 ) {
  18.         double ang = 2 * PI / len * ( invert ? - 1 : 1 ) ;
  19.         base wlen ( cos ( ang ) , sin ( ang ) ) ;
  20.         for ( int i = 0 ; i < n ; i += len ) {
  21.             base w ( 1 ) ;
  22.             for ( int j = 0 ; j < len / 2 ; ++ j ) {
  23.                 base u = a [ i + j ] ,  v = a [ i + j + len / 2 ] * w ;
  24.                 a [ i + j ] = u + v ;
  25.                 a [ i + j + len / 2 ] = u - v ;
  26.                 w *= wlen ;
  27.             }
  28.         }
  29.     }
  30.     if ( invert )
  31.         for ( int i = 0 ; i < n ; ++ i )
  32.             a [ i ] /= n ;
  33. }
  34.  
  35. void multiply ( const vector < int > & a, const vector < int > & b, vector < int > & res ) {
  36.     vector < base > fa ( a. begin ( ) , a. end ( ) ) ,  fb ( b. begin ( ) , b. end ( ) ) ;
  37.     size_t n = 1 ;
  38.     while ( n < max ( a. size ( ) , b. size ( ) ) )  n <<= 1 ;
  39.     n <<= 1 ;
  40.     fa. resize ( n ) ,  fb. resize ( n ) ;
  41.  
  42.     fft ( fa, false ) ,  fft ( fb, false ) ;
  43.     for ( size_t i = 0 ; i < n ; ++ i )
  44.         fa [ i ] *= fb [ i ] ;
  45.     fft ( fa, true ) ;
  46.  
  47.     res. resize ( n ) ;
  48.     for ( size_t i = 0 ; i < n ; ++ i )
  49.         res [ i ] = int ( fa [ i ] . real ( ) + 0.5 ) ;
  50.         int carry = 0 ;
  51.     for ( size_t i = 0 ; i < n ; ++ i ) {
  52.         res [ i ] += carry ;
  53.         carry = res [ i ] / 10 ;
  54.         res [ i ] %= 10 ;
  55.     }
  56. }
  57.  
  58. int xx[MAX];char s1[MAX],s2[MAX];
  59.  
  60. int main(){
  61.    // booster();
  62.     //read("input.txt");
  63.     int t;
  64.     scani(t);
  65.     while(t--){
  66.         vi a,b,res;
  67.         scanf("%s%s",s1,s2);
  68.         int len = strlen(s1);
  69.         for(int i = 0;i<len;i++)a.pb(s1[i]-48);
  70.         len = strlen(s2);
  71.         for(int i = 0;i<len;i++)b.pb(s2[i]-48);
  72.       //  for(auto it : b)cout<<it;cout<<endl;
  73.         reverse(all(a));
  74.         reverse(all(b));    
  75.         multiply(a,b,res);
  76.         int indx = 0;
  77.        // for(int i = 0;i<res.size();i++)cout<<res[i];cout<<endl;
  78.         reverse(all(res));
  79.         while(indx<res.size()&&res[indx]==0)indx++;
  80.         vi ans;
  81.         for(int i = res.size()-1;i>=indx;i--)ans.pb(res[i]);
  82.         reverse(all(ans));
  83.         if(ans.size()==0)printf("0");
  84.         else
  85.         for(auto it : ans){
  86.             printf("%d",it);
  87.         }
  88.         puts("");
  89.     }
  90.  
  91.  
  92.     return 0;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement