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); 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; }
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; }
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; }