int cp3(const Bigint &b)const { if (s != b.s) return s > b.s; if (s == -1) return -(-*this).cp3(-b); if (len() != b.len()) return len()>b.len()?1:-1; for (int i=len()-1; i>=0; i--) if (v[i]!=b.v[i]) return v[i]>b.v[i]?1:-1; return 0; }
int cp3(const Bigint &b)const { if (s != b.s) return s - b.s; if (s == -1) return -(-*this).cp3(-b); if (len() != b.len()) return len()-b.len();//int for (int i=len()-1; i>=0; i--) if (v[i]!=b.v[i]) return v[i]-b.v[i]; return 0; }
Bigint operator + (Bigint a, Bigint b) { if (a.len() < b.len()) swap(a, b); Bigint c; c.data = a.data, c.data.push_back(0); int r = 0; for (int i = 0; i < c.len(); i++) { c[i] += ((i < b.len()) ? b[i] : 0) + r; if ((r = (c[i] >= BASE))) c[i] -= BASE; } c.trim(); return c; }
Bigint operator * (const Bigint &b) { Bigint r; r.resize(len() + b.len() + 1); r.s = s * b.s; for (int i=0; i<len(); i++) { for (int j=0; j<b.len(); j++) { r.v[i+j] += v[i] * b.v[j]; if(r.v[i+j] >= BIGMOD) { r.v[i+j+1] += r.v[i+j] / BIGMOD; r.v[i+j] %= BIGMOD; } } } r.n(); return r; }
Bigint operator + (const Bigint &b) const { if (s == -1) return -(-(*this)+(-b)); if (b.s == -1) return (*this)-(-b); Bigint r; int nl = max(len(), b.len()); r.resize(nl + 1); for (int i=0; i<nl; i++) { if (i < len()) r.v[i] += v[i]; if (i < b.len()) r.v[i] += b.v[i]; if(r.v[i] >= BIGMOD) { r.v[i+1] += r.v[i] / BIGMOD; r.v[i] %= BIGMOD; } } r.n(); return r; }
pair<Bigint, int> divmod(Bigint a, int m) { long long r = 0; for (int i = a.len() - 1; i >= 0; i--) { r = r * BASE + a[i]; a[i] = r / m; r %= m; } a.trim(); return make_pair(a, (int) r); }
Bigint operator * (Bigint a, int m) { long long r = 0; for (int i = 0; i < a.len(); i++) { r += (long long) a[i] * m; a[i] = r % BASE; r /= BASE; } while (r) a.data.push_back(r % BASE), r /= BASE; a.trim(); return a; }
Bigint operator / (const Bigint &b) { Bigint r; r.resize(max(1, len()-b.len()+1)); int oriS = s; Bigint b2 = b; // b2 = abs(b) s = b2.s = r.s = 1; for (int i=r.len()-1; i>=0; i--) { int d=0, u=BIGMOD-1; while(d<u) { int m = (d+u+1)>>1; r.v[i] = m; if((r*b2) > (*this)) u = m-1; else d = m; } r.v[i] = d; } s = oriS; r.s = s * b.s; r.n(); return r; }
Bigint operator - (const Bigint &b) const { if (s == -1) return -(-(*this)-(-b)); if (b.s == -1) return (*this)+(-b); if ((*this) < b) return -(b-(*this)); Bigint r; r.resize(len()); for (int i=0; i<len(); i++) { r.v[i] += v[i]; if (i < b.len()) r.v[i] -= b.v[i]; if (r.v[i] < 0) { r.v[i] += BIGMOD; r.v[i+1]--; } } r.n(); return r; }