Advertisement
splash365

Fast Multiplication using FFT

Oct 13th, 2021
963
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.67 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define     rep(i,k,n)      for(int i=k;i<n;i++)
  5. #define     PI              acos(-1)
  6. #define     MP(x, y)        make_pair(x, y)
  7. #define     PB(x)           push_back(x)
  8. #define     ALL(p)          p.begin(),p.end()
  9. #define     CLR(p)          memset(p, 0, sizeof(p))
  10. #define     MEM(a, b)       memset(a, (b), sizeof(a))
  11. #define     PII             pair<int, int>
  12. #define     ll              long long int
  13. #define     ull             unsigned long long int
  14.  
  15. using cd = complex<double>;
  16.  
  17. void fft(vector<cd> & a, bool invert) {
  18.     int n = a.size();
  19.  
  20.     for (int i = 1, j = 0; i < n; i++) {
  21.         int bit = n >> 1;
  22.         for (; j & bit; bit >>= 1)
  23.             j ^= bit;
  24.         j ^= bit;
  25.  
  26.         if (i < j)
  27.             swap(a[i], a[j]);
  28.     }
  29.  
  30.     for (int len = 2; len <= n; len <<= 1) {
  31.         double ang = 2 * PI / len * (invert ? -1 : 1);
  32.         cd wlen(cos(ang), sin(ang));
  33.         for (int i = 0; i < n; i += len) {
  34.             cd w(1);
  35.             for (int j = 0; j < len / 2; j++) {
  36.                 cd u = a[i+j], v = a[i+j+len/2] * w;
  37.                 a[i+j] = u + v;
  38.                 a[i+j+len/2] = u - v;
  39.                 w *= wlen;
  40.             }
  41.         }
  42.     }
  43.  
  44.     if (invert) {
  45.         for (cd & x : a)
  46.             x /= n;
  47.     }
  48. }
  49.  
  50. vector<int> multiply(vector<int> const& a, vector<int> const& b) {
  51.     vector<cd> fa(a.begin(), a.end()), fb(b.begin(), b.end());
  52.     int n = 1;
  53.     while (n < a.size() + b.size())
  54.         n <<= 1;
  55.     fa.resize(n);
  56.     fb.resize(n);
  57.  
  58.     fft(fa, false);
  59.     fft(fb, false);
  60.     for (int i = 0; i < n; i++)
  61.         fa[i] *= fb[i];
  62.     fft(fa, true);
  63.  
  64.     vector<int> result(n);
  65.     for (int i = 0; i < n; i++)
  66.         result[i] = round(fa[i].real());
  67.     return result;
  68. }
  69.  
  70.  
  71. int main()
  72. {
  73.     int t;
  74.     cin >> t;
  75.     while(t--)
  76.     {
  77.         string s1, s2;
  78.         cin >> s1 >> s2;
  79.        
  80.         vector<int> a, b;
  81.         for(auto i:s1)
  82.             a.push_back(i - '0');
  83.         for(auto i:s2)
  84.             b.push_back(i - '0');
  85.        
  86.         reverse(ALL(a));
  87.         reverse(ALL(b));
  88.        
  89.         vector<int> result = multiply(a, b);
  90.        
  91.         int carry = 0;
  92.         rep(i, 0, result.size())
  93.         {
  94.             result[i] += carry;
  95.             carry = result[i] / 10;
  96.             result[i] %= 10;
  97.         }
  98.         reverse(ALL(result));
  99.         bool zero = true;
  100.         for(auto i : result)
  101.         {
  102.             if(i == 0 && zero)
  103.                 continue;
  104.             zero = false;
  105.             cout << i;
  106.         }
  107.         if(zero)
  108.             cout << "0";
  109.         cout << "\n";
  110.     }
  111.     return 0;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement