BigInteger operator/(BigInteger& x) { BigInteger res; res.size = size - x.size + 1;//max(size - x.size, size - x.size + 1);//1); for(int i = res.size-1; i >= 0; i--) { int l = 0, r = BASE - 1; while(l < r) { int mid = (l+r)/2; res.M[i] = mid; BigInteger tmp = (x*res); if(tmp < (*this)) l = mid+1; else r = mid; } res.M[i] = l; if(*this < x*res) { if(res.M[i] == 1) res.size--; res.M[i]--; } } res.Normalize(); return res; }
BigInteger operator-(BigInteger& x) { BigInteger res; res.size = max(size,x.size) + 1; for(int i = 0; i < res.size; i++) res.M[i] = M[i] - x.M[i]; res.Normalize(); return res; }
BigInteger operator*(BigInteger& x) { BigInteger res; res.size = size + x.size + 2; for(int i = 0; i < size; i++) for(int j = 0; j < x.size; j++) res.M[i+j] += M[i]*x.M[j]; res.Normalize(); return res; }
BigInteger operator/(int x) { BigInteger res = *this; __int64 mod = 0; for(int i = size - 1; i >= 0; i--) { int tmp = mod * BASE + res.M[i]; res.M[i] = tmp / x; mod = tmp % x; } res.Normalize(); return res; }