Advertisement
Guest User

Untitled

a guest
Jan 18th, 2020
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.58 KB | None | 0 0
  1. struct bigint {
  2.     vector<int> a;
  3.     int sign;
  4.     int size(){
  5.         if(a.empty())return 0;
  6.         int ans=(a.size()-1)*base_digits;
  7.         int ca=a.back();
  8.         while(ca)
  9.             ans++,ca/=10;
  10.         return ans;
  11.     }
  12.     bigint operator ^(const bigint &v){
  13.         bigint ans=1,a=*this,b=v;
  14.         while(!b.isZero()){
  15.             if(b%2)
  16.                 ans*=a;
  17.             a*=a,b/=2;
  18.         }
  19.         return ans;
  20.     }
  21.     string to_string(){
  22.         stringstream ss;
  23.         ss << *this;
  24.         string s;
  25.         ss >> s;
  26.         return s;
  27.     }
  28.     int sumof(){
  29.         string s = to_string();
  30.         int ans = 0;
  31.         for(auto c : s)  ans += c - '0';
  32.         return ans;
  33.     }
  34.     /*</arpa>*/
  35.     bigint() :
  36.         sign(1) {
  37.     }
  38.  
  39.     bigint(long long v) {
  40.         *this = v;
  41.     }
  42.  
  43.     bigint(const string &s) {
  44.         read(s);
  45.     }
  46.  
  47.     void operator=(const bigint &v) {
  48.         sign = v.sign;
  49.         a = v.a;
  50.     }
  51.  
  52.     void operator=(long long v) {
  53.         sign = 1;
  54.         a.clear();
  55.         if (v < 0)
  56.             sign = -1, v = -v;
  57.         for (; v > 0; v = v / base)
  58.             a.push_back(v % base);
  59.     }
  60.  
  61.     bigint operator+(const bigint &v) const {
  62.         if (sign == v.sign) {
  63.             bigint res = v;
  64.  
  65.             for (int i = 0, carry = 0; i < (int) max(a.size(), v.a.size()) || carry; ++i) {
  66.                 if (i == (int) res.a.size())
  67.                     res.a.push_back(0);
  68.                 res.a[i] += carry + (i < (int) a.size() ? a[i] : 0);
  69.                 carry = res.a[i] >= base;
  70.                 if (carry)
  71.                     res.a[i] -= base;
  72.             }
  73.             return res;
  74.         }
  75.         return *this - (-v);
  76.     }
  77.  
  78.     bigint operator-(const bigint &v) const {
  79.         if (sign == v.sign) {
  80.             if (abs() >= v.abs()) {
  81.                 bigint res = *this;
  82.                 for (int i = 0, carry = 0; i < (int) v.a.size() || carry; ++i) {
  83.                     res.a[i] -= carry + (i < (int) v.a.size() ? v.a[i] : 0);
  84.                     carry = res.a[i] < 0;
  85.                     if (carry)
  86.                         res.a[i] += base;
  87.                 }
  88.                 res.trim();
  89.                 return res;
  90.             }
  91.             return -(v - *this);
  92.         }
  93.         return *this + (-v);
  94.     }
  95.  
  96.     void operator*=(int v) {
  97.         if (v < 0)
  98.             sign = -sign, v = -v;
  99.         for (int i = 0, carry = 0; i < (int) a.size() || carry; ++i) {
  100.             if (i == (int) a.size())
  101.                 a.push_back(0);
  102.             long long cur = a[i] * (long long) v + carry;
  103.             carry = (int) (cur / base);
  104.             a[i] = (int) (cur % base);
  105.             //asm("divl %%ecx" : "=a"(carry), "=d"(a[i]) : "A"(cur), "c"(base));
  106.         }
  107.         trim();
  108.     }
  109.  
  110.     bigint operator*(int v) const {
  111.         bigint res = *this;
  112.         res *= v;
  113.         return res;
  114.     }
  115.  
  116.     void operator*=(long long v) {
  117.         if (v < 0)
  118.             sign = -sign, v = -v;
  119.         if(v > base){
  120.             *this = *this * (v / base) * base + *this * (v % base);
  121.             return ;
  122.         }
  123.         for (int i = 0, carry = 0; i < (int) a.size() || carry; ++i) {
  124.             if (i == (int) a.size())
  125.                 a.push_back(0);
  126.             long long cur = a[i] * (long long) v + carry;
  127.             carry = (int) (cur / base);
  128.             a[i] = (int) (cur % base);
  129.             //asm("divl %%ecx" : "=a"(carry), "=d"(a[i]) : "A"(cur), "c"(base));
  130.         }
  131.         trim();
  132.     }
  133.  
  134.     bigint operator*(long long v) const {
  135.         bigint res = *this;
  136.         res *= v;
  137.         return res;
  138.     }
  139.  
  140.     friend pair<bigint, bigint> divmod(const bigint &a1, const bigint &b1) {
  141.         int norm = base / (b1.a.back() + 1);
  142.         bigint a = a1.abs() * norm;
  143.         bigint b = b1.abs() * norm;
  144.         bigint q, r;
  145.         q.a.resize(a.a.size());
  146.  
  147.         for (int i = a.a.size() - 1; i >= 0; i--) {
  148.             r *= base;
  149.             r += a.a[i];
  150.             int s1 = r.a.size() <= b.a.size() ? 0 : r.a[b.a.size()];
  151.             int s2 = r.a.size() <= b.a.size() - 1 ? 0 : r.a[b.a.size() - 1];
  152.             int d = ((long long) base * s1 + s2) / b.a.back();
  153.             r -= b * d;
  154.             while (r < 0)
  155.                 r += b, --d;
  156.             q.a[i] = d;
  157.         }
  158.  
  159.         q.sign = a1.sign * b1.sign;
  160.         r.sign = a1.sign;
  161.         q.trim();
  162.         r.trim();
  163.         return make_pair(q, r / norm);
  164.     }
  165.  
  166.     bigint operator/(const bigint &v) const {
  167.         return divmod(*this, v).first;
  168.     }
  169.  
  170.     bigint operator%(const bigint &v) const {
  171.         return divmod(*this, v).second;
  172.     }
  173.  
  174.     void operator/=(int v) {
  175.         if (v < 0)
  176.             sign = -sign, v = -v;
  177.         for (int i = (int) a.size() - 1, rem = 0; i >= 0; --i) {
  178.             long long cur = a[i] + rem * (long long) base;
  179.             a[i] = (int) (cur / v);
  180.             rem = (int) (cur % v);
  181.         }
  182.         trim();
  183.     }
  184.  
  185.     bigint operator/(int v) const {
  186.         bigint res = *this;
  187.         res /= v;
  188.         return res;
  189.     }
  190.  
  191.     int operator%(int v) const {
  192.         if (v < 0)
  193.             v = -v;
  194.         int m = 0;
  195.         for (int i = a.size() - 1; i >= 0; --i)
  196.             m = (a[i] + m * (long long) base) % v;
  197.         return m * sign;
  198.     }
  199.  
  200.     void operator+=(const bigint &v) {
  201.         *this = *this + v;
  202.     }
  203.     void operator-=(const bigint &v) {
  204.         *this = *this - v;
  205.     }
  206.     void operator*=(const bigint &v) {
  207.         *this = *this * v;
  208.     }
  209.     void operator/=(const bigint &v) {
  210.         *this = *this / v;
  211.     }
  212.  
  213.     bool operator<(const bigint &v) const {
  214.         if (sign != v.sign)
  215.             return sign < v.sign;
  216.         if (a.size() != v.a.size())
  217.             return a.size() * sign < v.a.size() * v.sign;
  218.         for (int i = a.size() - 1; i >= 0; i--)
  219.             if (a[i] != v.a[i])
  220.                 return a[i] * sign < v.a[i] * sign;
  221.         return false;
  222.     }
  223.  
  224.     bool operator>(const bigint &v) const {
  225.         return v < *this;
  226.     }
  227.     bool operator<=(const bigint &v) const {
  228.         return !(v < *this);
  229.     }
  230.     bool operator>=(const bigint &v) const {
  231.         return !(*this < v);
  232.     }
  233.     bool operator==(const bigint &v) const {
  234.         return !(*this < v) && !(v < *this);
  235.     }
  236.     bool operator!=(const bigint &v) const {
  237.         return *this < v || v < *this;
  238.     }
  239.  
  240.     void trim() {
  241.         while (!a.empty() && !a.back())
  242.             a.pop_back();
  243.         if (a.empty())
  244.             sign = 1;
  245.     }
  246.  
  247.     bool isZero() const {
  248.         return a.empty() || (a.size() == 1 && !a[0]);
  249.     }
  250.  
  251.     bigint operator-() const {
  252.         bigint res = *this;
  253.         res.sign = -sign;
  254.         return res;
  255.     }
  256.  
  257.     bigint abs() const {
  258.         bigint res = *this;
  259.         res.sign *= res.sign;
  260.         return res;
  261.     }
  262.  
  263.     long long longValue() const {
  264.         long long res = 0;
  265.         for (int i = a.size() - 1; i >= 0; i--)
  266.             res = res * base + a[i];
  267.         return res * sign;
  268.     }
  269.  
  270.     friend bigint gcd(const bigint &a, const bigint &b) {
  271.         return b.isZero() ? a : gcd(b, a % b);
  272.     }
  273.     friend bigint lcm(const bigint &a, const bigint &b) {
  274.         return a / gcd(a, b) * b;
  275.     }
  276.  
  277.     void read(const string &s) {
  278.         sign = 1;
  279.         a.clear();
  280.         int pos = 0;
  281.         while (pos < (int) s.size() && (s[pos] == '-' || s[pos] == '+')) {
  282.             if (s[pos] == '-')
  283.                 sign = -sign;
  284.             ++pos;
  285.         }
  286.         for (int i = s.size() - 1; i >= pos; i -= base_digits) {
  287.             int x = 0;
  288.             for (int j = max(pos, i - base_digits + 1); j <= i; j++)
  289.                 x = x * 10 + s[j] - '0';
  290.             a.push_back(x);
  291.         }
  292.         trim();
  293.     }
  294.  
  295.     friend istream& operator>>(istream &stream, bigint &v) {
  296.         string s;
  297.         stream >> s;
  298.         v.read(s);
  299.         return stream;
  300.     }
  301.  
  302.     friend ostream& operator<<(ostream &stream, const bigint &v) {
  303.         if (v.sign == -1)
  304.             stream << '-';
  305.         stream << (v.a.empty() ? 0 : v.a.back());
  306.         for (int i = (int) v.a.size() - 2; i >= 0; --i)
  307.             stream << setw(base_digits) << setfill('0') << v.a[i];
  308.         return stream;
  309.     }
  310.  
  311.     static vector<int> convert_base(const vector<int> &a, int old_digits, int new_digits) {
  312.         vector<long long> p(max(old_digits, new_digits) + 1);
  313.         p[0] = 1;
  314.         for (int i = 1; i < (int) p.size(); i++)
  315.             p[i] = p[i - 1] * 10;
  316.         vector<int> res;
  317.         long long cur = 0;
  318.         int cur_digits = 0;
  319.         for (int i = 0; i < (int) a.size(); i++) {
  320.             cur += a[i] * p[cur_digits];
  321.             cur_digits += old_digits;
  322.             while (cur_digits >= new_digits) {
  323.                 res.push_back(int(cur % p[new_digits]));
  324.                 cur /= p[new_digits];
  325.                 cur_digits -= new_digits;
  326.             }
  327.         }
  328.         res.push_back((int) cur);
  329.         while (!res.empty() && !res.back())
  330.             res.pop_back();
  331.         return res;
  332.     }
  333.  
  334.     typedef vector<long long> vll;
  335.  
  336.     static vll karatsubaMultiply(const vll &a, const vll &b) {
  337.         int n = a.size();
  338.         vll res(n + n);
  339.         if (n <= 32) {
  340.             for (int i = 0; i < n; i++)
  341.                 for (int j = 0; j < n; j++)
  342.                     res[i + j] += a[i] * b[j];
  343.             return res;
  344.         }
  345.  
  346.         int k = n >> 1;
  347.         vll a1(a.begin(), a.begin() + k);
  348.         vll a2(a.begin() + k, a.end());
  349.         vll b1(b.begin(), b.begin() + k);
  350.         vll b2(b.begin() + k, b.end());
  351.  
  352.         vll a1b1 = karatsubaMultiply(a1, b1);
  353.         vll a2b2 = karatsubaMultiply(a2, b2);
  354.  
  355.         for (int i = 0; i < k; i++)
  356.             a2[i] += a1[i];
  357.         for (int i = 0; i < k; i++)
  358.             b2[i] += b1[i];
  359.  
  360.         vll r = karatsubaMultiply(a2, b2);
  361.         for (int i = 0; i < (int) a1b1.size(); i++)
  362.             r[i] -= a1b1[i];
  363.         for (int i = 0; i < (int) a2b2.size(); i++)
  364.             r[i] -= a2b2[i];
  365.  
  366.         for (int i = 0; i < (int) r.size(); i++)
  367.             res[i + k] += r[i];
  368.         for (int i = 0; i < (int) a1b1.size(); i++)
  369.             res[i] += a1b1[i];
  370.         for (int i = 0; i < (int) a2b2.size(); i++)
  371.             res[i + n] += a2b2[i];
  372.         return res;
  373.     }
  374.  
  375.     bigint operator*(const bigint &v) const {
  376.         vector<int> a6 = convert_base(this->a, base_digits, 6);
  377.         vector<int> b6 = convert_base(v.a, base_digits, 6);
  378.         vll a(a6.begin(), a6.end());
  379.         vll b(b6.begin(), b6.end());
  380.         while (a.size() < b.size())
  381.             a.push_back(0);
  382.         while (b.size() < a.size())
  383.             b.push_back(0);
  384.         while (a.size() & (a.size() - 1))
  385.             a.push_back(0), b.push_back(0);
  386.         vll c = karatsubaMultiply(a, b);
  387.         bigint res;
  388.         res.sign = sign * v.sign;
  389.         for (int i = 0, carry = 0; i < (int) c.size(); i++) {
  390.             long long cur = c[i] + carry;
  391.             res.a.push_back((int) (cur % 1000000));
  392.             carry = (int) (cur / 1000000);
  393.         }
  394.         res.a = convert_base(res.a, 6, base_digits);
  395.         res.trim();
  396.         return res;
  397.     }
  398. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement