高精度模板

#include<bits/stdc++.h>
//#include<iomanip> 
#define int long long
#define fore(i, a, b) for( int i = (a); i <= (b); ++ i)
#define repe(i, a, b) for( int i = (a); i >= (b); -- i)
using namespace std;
const int BASE = 1e8;
struct Biger{
	vector<int> val; bool neg;
	void trim() {
		while(val.size() > 1 && val.back() == 0) val.pop_back();
		if(val.size() == 1 && val[0] == 0) neg = false;
	}
	int cmp_abs(const Biger& x) const {
		if(val.size() != x.val.size()) return val.size() > x.val.size() ? 1 : -1;
		repe(i, val.size()-1, 0) if(val[i] != x.val[i]) return val[i] > x.val[i] ? 1 : -1;
		return 0;
	}
	Biger add(const Biger& x) const {
		Biger res; res.val.clear();
		int carry = 0, i = 0;
		while(i < val.size() || i < x.val.size() || carry) {
			if(i < val.size()) carry += val[i];
			if(i < x.val.size()) carry += x.val[i];
			res.val.push_back(carry % BASE); carry /= BASE; i ++;
		} res.trim(); return res;
	}
	Biger sub(const Biger& x) const {
		Biger res; res.val.clear();
		int borrow = 0, i = 0;
		while(i < val.size()) {
			int num = val[i] - borrow;
			if(i < x.val.size()) num -= x.val[i];
			borrow = 0;	
			if(num < 0) num += BASE, borrow = 1;
			res.val.push_back(num); i ++;
		}
		res.trim(); return res;
	}
	Biger mul(const Biger& x) const {
		Biger res;
		res.val.resize(val.size() + x.val.size(), 0);
		for(int i = 0;i < val.size(); i ++) {
			int carry = 0;
			for(int j = 0; j < x.val.size() || carry; j ++) {
				int t = res.val[i + j] + val[i] * (j < x.val.size() ? x.val[j] : 0) + carry;
				carry = t / BASE;
				res.val[i + j] = t % BASE;
			}
		} res.trim(); return res;
	}
	Biger div2() const {
		Biger res;
		res.val.resize(val.size());
		int rem = 0;
		for(int i = val.size() - 1; i >= 0; i --) {
			int x = val[i] + rem * BASE;
			res.val[i] = x / 2;
			rem = x % 2;
		} res.trim();
		res.neg = neg;
		return res;
	}
	Biger div(const Biger& x) const {
		if(x.cmp_abs(Biger{}) == 0) {
			return Biger{};
		}
		if(cmp_abs(x) < 0) return Biger{};
		Biger l{}, r{*this}, ans{};
		while(l.cmp_abs(r) <= 0) {
			Biger mid = (l.add(r)).div2();
			Biger t = mid.mul(x);
			if(t.cmp_abs(*this) <= 0) {
				ans = mid;
				l = mid.add(Biger{}.fromll(1));
			} else {
				r = mid.sub(Biger{}.fromll(1));
			}
		} return ans;
	}
	Biger mod(const Biger& x) const{
		Biger d = div(x);
		return sub(d.mul(x));
	}
	Biger& fromll(int num) {
		neg = num < 0; num = llabs(num);  val.clear();
		if(num == 0) {
			val.push_back(0);
			return *this;
		} 
		while(num) {
			val.push_back(num % BASE);
			num /= BASE;
		}
		return *this;
	}
	Biger& fromstr(const string& s) {
		neg = false; val.clear(); int st = 0;
		if(!s.empty() && s[0] == '-') { neg = true; st = 1; }
		for(int i = s.size() - 1; i >= st; i -= 8) {
			int num = 0, start = max(st, i - 7);
			for(int j = start; j <= i; j ++) num = num * 10 + (s[j] - '0');
			val.push_back(num);
		} trim(); return *this;
	}
	long long to_ll() const {
		Biger max_ll;
		max_ll.fromll(LLONG_MAX);
		if (this->cmp_abs(max_ll) > 0) {
			exit(1);
		}
		long long res = 0;
		for (int i = (int)val.size() - 1; i >= 0; --i) {
			res = res * BASE + val[i];
		}

		return neg ? -res : res;
	}
	Biger() : neg(false) { val.push_back(0); }
	Biger(const Biger& x) = default;
	Biger operator-() const {
		Biger res = *this;
		if(res.cmp_abs(Biger{}) != 0) res.neg = !res.neg;
		return res;
	}
	bool operator==(const Biger& x) const { return neg == x.neg && val == x.val; }
	bool operator!=(const Biger& x) const { return !(*this == x); }
	bool operator<(const Biger& x) const {
		if(neg != x.neg) return neg;
		if(neg) return cmp_abs(x) > 0;
		return cmp_abs(x) < 0;
	}
	bool operator>(const Biger& x) const{ return x < *this; }
	bool operator<=(const Biger& x) const { return !(*this > x); }
	bool operator>=(const Biger& x) const { return !(*this < x); }
	
	Biger& operator+=(const Biger& x) {
		if(neg == x.neg) {
			*this = add(x);
		} else {
			int c = cmp_abs(x);
			if(c == 0) *this = Biger{};
			else if(c > 0) *this = sub(x), this->neg = neg;
			else *this = x.sub(*this), this->neg = x.neg;
		} trim(); return *this;
	}
	Biger& operator-=(const Biger& x) { return *this += (-x); }
	Biger& operator*=(const Biger& x) { *this = mul(x); neg ^= x.neg; trim(); return *this; }	
	Biger& operator/=(const Biger& x) { *this = div(x); neg ^= x.neg; trim(); return *this; }
	Biger& operator%=(const Biger& x) { *this = mod(x); trim(); return *this; }
	Biger operator+(const Biger& x) const { Biger r = *this; r += x; return r; }
	Biger operator-(const Biger& x) const { Biger r = *this; r -= x; return r; }
	Biger operator*(const Biger& x) const { Biger r = *this; r *= x; return r; }
	Biger operator/(const Biger& x) const { Biger r = *this; r /= x; return r; }
	Biger operator%(const Biger& x) const { Biger r = *this; r %= x; return r; }
};

ostream& operator<<(ostream& os, const Biger& x) {
    if (x.neg) os << '-';
    os << x.val.back();
    for (int i = (int)x.val.size()-2; i >= 0; --i) {
        os << setw(8) << setfill('0') << x.val[i];
    }
    os << setfill(' ');
    return os;
}
std::istream& operator>>(std::istream& is, Biger& x) {
	std::string s; is >> s; x.fromstr(s);
    return is;
}
Biger a;
signed main()
{
	ios::sync_with_stdio(false);
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	cin >> a;
	return 0;
}














































posted @ 2026-04-14 22:14  wmq2012  阅读(4)  评论(0)    收藏  举报