Advertisement
aayyk

Untitled

Oct 7th, 2022
806
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.05 KB | None | 0 0
  1. #include <vector>
  2. #include <algorithm>
  3.  
  4. using namespace std;
  5.  
  6. const int base = 10;
  7.  
  8. vector <int> add(const vector <int>& a, const vector <int>& b) {
  9.     vector <int> c(max(a.size(), b.size()));
  10.     for (size_t i = 0; i < max(a.size(), b.size()); i++) {
  11.         if (i < a.size() && i < b.size()) {
  12.             c[i] += a[i] + b[i];
  13.         } else if (a.size() > b.size()) {
  14.             c[i] += a[i];
  15.         } else {
  16.             c[i] += b[i];
  17.         }
  18.  
  19.         if (c[i] < base) continue;
  20.         if (i + 1 == c.size()) {
  21.             c.push_back(1);
  22.         } else {
  23.             c[i + 1]++;
  24.         }
  25.         c[i] -= base;
  26.     }
  27.  
  28.     return c;
  29. }
  30.  
  31. vector <int> sub(const vector <int>& a, const vector <int>& b) {
  32.     vector <int> c(max(a.size(), b.size()));
  33.     for (size_t i = 0; i < max(a.size(), b.size()); i++) {
  34.         if (i < a.size() && i < b.size()) {
  35.             c[i] += a[i] - b[i];
  36.         } else {
  37.             c[i] += a[i];
  38.         }
  39.  
  40.         if (c[i] >= 0) continue;
  41.         if (i + 1 == c.size()) {
  42.             c.push_back(-1);
  43.         } else {
  44.             c[i + 1]--;
  45.         }
  46.         c[i] += base;
  47.     }
  48.  
  49.     while (c.size() > 1 && c.back() == 0) {
  50.         c.pop_back();
  51.     }
  52.  
  53.     return c;
  54. }
  55.  
  56. void normalize(vector <int>& a) {
  57.     for (size_t i = 0; i < a.size(); i++) {
  58.         if (a[i] < base) continue;
  59.         if (i + 1 == a.size()) {
  60.             a.push_back(a[i] / base);
  61.         } else {
  62.             a[i + 1] += a[i] / base;
  63.         }
  64.         a[i] %= base;
  65.     }
  66.  
  67.     while (a.size() > 1 && a.back() == 0) {
  68.         a.pop_back();
  69.     }
  70. }
  71.  
  72. void shift(vector <int>& a, int x) {
  73.     reverse(a.begin(), a.end());
  74.     while (x--) {
  75.         a.push_back(0);
  76.     }
  77.     reverse(a.begin(), a.end());
  78. }
  79.  
  80. vector <int> naive(vector <int>& a, vector <int>& b) {
  81.     vector <int> c(a.size() + b.size() - 1);
  82.     for (size_t i = 0; i < a.size(); i++) {
  83.         for (size_t j = 0; j < b.size(); j++) {
  84.             c[i + j] += a[i] * b[j];
  85.         }
  86.     }
  87.  
  88.     normalize(c);
  89.     return c;
  90. }
  91.  
  92. vector <int> mul(vector <int> a, vector <int> b);
  93.  
  94. vector <int> karatsuba(vector <int>& a, vector <int>& b) {
  95.     while (a.size() % 2) a.push_back(0);
  96.     while (b.size() % 2) b.push_back(0);
  97.     while (a.size() < b.size()) a.push_back(0);
  98.     while (b.size() < a.size()) b.push_back(0);
  99.  
  100.     size_t n = a.size();
  101.  
  102.     vector <int> a1(n / 2), a2(n / 2), b1(n / 2), b2(n / 2);
  103.     for (size_t i = 0; i < n / 2; i++) {
  104.         a1[i] = a[i];
  105.         b1[i] = b[i];
  106.     }
  107.     for (size_t i = n / 2; i < n; i++) {
  108.         a2[i - n / 2] = a[i];
  109.         b2[i - n / 2] = b[i];
  110.     }
  111.  
  112.     auto a1b1 = mul(a1, b1);
  113.     auto a2b2 = mul(a2, b2);
  114.     auto k = sub(sub(mul(add(a1, a2), add(b1, b2)), a1b1), a2b2);
  115.  
  116.     shift(k, n / 2);
  117.     shift(a2b2, n);
  118.  
  119.     vector <int> c = add(a1b1, add(k, a2b2));
  120.  
  121.     normalize(c);
  122.     return c;
  123. }
  124.  
  125. vector <int> mul(vector <int> a, vector <int> b) {
  126.     if (a.size() <= 3 && b.size() <= 3) {
  127.         return naive(a, b);
  128.     } else {
  129.         return karatsuba(a, b);
  130.     }
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement