#include<bits/stdc++.h>
using namespace std;
class INT {
private:
bool isNeg, isNumber;
std::vector<int> num;
public:
INT() {
num.clear();
isNeg = false;
isNumber = false;
}
INT& check() {
while (num.size() > 1 && num.back() == 0)num.pop_back();
if (num[0] == 0 && num.size() == 1)isNeg = false;
if (num.back() == 0)return *this;
for (size_t i = 1; i < num.size(); i++) {
if (num[i - 1] < 0) {
num[i - 1] += 10;
num[i]--;
}
num[i] += num[i - 1] / 10;
num[i - 1] %= 10;
}
while (num.back() >= 10) {
num.push_back(num.back() / 10);
num[num.size() - 2] %= 10;
}
while (num.size() > 1 && num.back() == 0)num.pop_back();
return *this;
}
INT(int x) {
num.clear();
if (x < 0)x = -x, isNeg = true;
else isNeg = false;
int x2 = x;
while (x2 != 0) {
num.push_back(x2 % 10);
x2 /= 10;
}
isNumber = true;
if (x == 0)num.push_back(0);
}
INT(long x) {
num.clear();
if (x < 0)x = -x, isNeg = true;
else isNeg = false;
long x2 = x;
while (x2 != 0) {
num.push_back(x2 % 10);
x2 /= 10;
}
isNumber = true;
if (x == 0)num.push_back(0);
}
INT(long long x) {
num.clear();
if (x < 0)x = -x, isNeg = true;
else isNeg = false;
long long x2 = x;
while (x2 != 0) {
num.push_back(x2 % 10);
x2 /= 10;
}
isNumber = true;
if (x == 0)num.push_back(0);
}
INT(unsigned x) {
num.clear();
unsigned x2 = x;
while (x2 != 0) {
num.push_back(x2 % 10);
x2 /= 10;
}
isNumber = true;
if (x == 0)num.push_back(0);
}
INT(unsigned long x) {
num.clear();
unsigned long x2 = x;
while (x2 != 0) {
num.push_back(x2 % 10);
x2 /= 10;
}
isNumber = true;
if (x == 0)num.push_back(0);
}
INT(unsigned long long x) {
num.clear();
unsigned long long x2 = x;
while (x2 != 0) {
num.push_back(x2 % 10);
x2 /= 10;
}
isNumber = true;
if (x == 0)num.push_back(0);
}
INT(char x) {
num.clear();
num.push_back(x);
check();
isNumber = true;
if (x == 0)num.push_back(0);
}
INT(std::string s) {
num.clear();
isNeg = false;
int leftIndex = 0, i = s.size() - 1;
while (s[leftIndex] > '9' || s[leftIndex] < '0') {
if (s[leftIndex] == '-')isNeg = !isNeg;
leftIndex++;
}
num.clear();
bool flag = true;
for (i = s.size() - 1; i >= leftIndex; i--) {
if (s[i] > '9' || s[i] < '0') {
flag = false;
break;
}
num.push_back(s[i] - '0');
}
if (flag)isNumber = true;
}
INT operator+() {
INT res = *this;
return res;
}
INT operator-() {
INT res = *this;
res.isNeg = !res.isNeg;
return res;
}
size_t size() {
return num.size();
}
friend INT operator+=(INT&, INT);
friend INT operator+(INT, INT);
friend INT operator-=(INT&, INT);
friend INT operator-(INT, INT);
friend INT operator*(INT, INT);
friend INT operator*=(INT&, INT);
friend INT operator/(INT, INT);
friend INT operator/=(INT&, INT);
friend INT operator%(INT, INT);
friend INT operator%=(INT&, INT);
friend INT tobinary(INT);
friend INT todecimal(INT);
friend INT operator&(INT, INT);
friend INT operator&=(INT&, INT);
friend INT operator|(INT, INT);
friend INT operator|=(INT&, INT);
friend INT operator~(INT);
friend INT operator^(INT, INT);
friend INT operator^=(INT&, INT);
friend INT operator<<(INT, INT);
friend INT operator<<=(INT&, INT);
friend INT operator>>(INT, INT);
friend INT operator>>=(INT&, INT);
friend std::ostream& operator<<(std::ostream&, const INT&);
friend std::istream& operator>>(std::istream&, INT&);
friend bool operator==(const INT &a, const INT &b);
friend bool operator!=(const INT &a, const INT &b);
friend bool operator<(const INT &a, const INT &b);
friend bool operator>(const INT &a, const INT &b);
friend bool operator<=(const INT &a, const INT &b);
friend bool operator>=(const INT &a, const INT &b);
friend bool operator&&(const INT &a, const INT &b);
friend bool operator||(const INT &a, const INT &b);
friend bool operator!(const INT &a);
friend INT pow(INT, INT);
friend INT abs(INT);
protected:
friend INT div(INT, INT, bool);
};
std::istream& operator>>(std::istream& is, INT& n) {
std::string s;
is >> s;
n.isNeg = false;
int leftIndex = 0, i = s.size() - 1;
while (s[leftIndex] > '9' || s[leftIndex] < '0') {
if (s[leftIndex] == '-')n.isNeg = !n.isNeg;
leftIndex++;
}
n.num.clear();
for (i = s.size() - 1; i >= leftIndex; i--) {
if (s[i] > '9' || s[i] < '0') {
break;
}
n.num.push_back(s[i] - '0');
}
if (i <= leftIndex)n.isNumber = true;
return is;
}
std::ostream& operator<<(std::ostream& os, const INT& n) {
if (!n.isNumber)os << "error";
else {
if (n.isNeg)os << "-";
for (int i = n.num.size() - 1; i >= 0; i--)os << n.num[i];
}
return os;
}
bool operator==(const INT& a, const INT& b) {
if (a.num.size() != b.num.size())return false;
if (a.isNeg != b.isNeg)return false;
for (int i = a.num.size() - 1; i >= 0; i--)
if (a.num[i] != b.num[i])return false;
return true;
}
bool operator!=(const INT &a, const INT &b) {
return !(a == b);
}
bool operator<(const INT &a, const INT &b) {
if (a.isNeg || b.isNeg) {
if (a.isNeg && !b.isNeg)return true;
if (!a.isNeg && b.isNeg)return false;
if (a.num.size() != b.num.size())return a.num.size() > b.num.size();
for (int i = a.num.size() - 1; i >= 0; i--)
if (a.num[i] != b.num[i])return a.num[i] > b.num[i];
} else {
if (a.num.size() != b.num.size())return a.num.size() < b.num.size();
for (int i = a.num.size() - 1; i >= 0; i--)
if (a.num[i] != b.num[i])return a.num[i] < b.num[i];
}
return 0;
}
bool operator>(const INT &a, const INT &b) {
return b < a;
}
bool operator<=(const INT &a, const INT &b) {
return !(a > b);
}
bool operator>=(const INT &a, const INT &b) {
return !(a < b);
}
bool operator&&(const INT &a, const INT &b) {
return (a != 0) && (b != 0);
}
bool operator||(const INT &a, const INT &b) {
return (a != 0) || (b != 0);
}
bool operator!(const INT &a) {
return !(a != 0);
}
INT operator+=(INT &a, INT b) {
if (!a.isNeg && b.isNeg)return a = (a -= (-b));
if (a.isNeg && !b.isNeg)return a = (b -= (-a));
if (a.num.size() < b.num.size())a.num.resize((int)b.num.size(), 0);
for (size_t i = 0; i != b.num.size(); i++)a.num[i] += b.num[i];
return a.check();
}
INT operator+(INT a, INT b) {
return a += b;
}
INT operator-=(INT &a, INT b) {
if (b.isNeg)return a = (a + (-b));
if (a.isNeg)return a = -((-a) + b);
if (a < b) {
INT t;
t = a;
a = b;
b = t;
a.isNeg = true;
}
if (a.num.size() < b.num.size())a.num.resize((int)b.num.size(), 0);
for (size_t i = 0; i != b.num.size(); i++) {
a.num[i] -= b.num[i];
if (a.num[i] < 0) {
a.num[i] += 10;
a.num[i + 1]--;
}
}
return a.check();
}
INT operator-(INT a, INT b) {
return a -= b;
}
INT operator*(INT a, INT b) {
INT ans(0);
if (a.isNeg == b.isNeg)ans.isNeg = false;
else ans.isNeg = true;
ans.num.resize((int)a.num.size() + b.num.size(), 0);
for (size_t i = 0; i < a.num.size(); i++) {
for (size_t j = 0; j < b.num.size(); j++) {
ans.num[i + j] += a.num[i] * b.num[j];
}
}
return ans.check();
}
INT operator*=(INT& a, INT b) {
return a = a*b;
}
INT div(INT a, INT b, bool mode) {
INT cur(0);
INT quo(0);
cur.num.pop_back();
quo.isNumber = true;
if (a.isNeg == b.isNeg)quo.isNeg = false;
else quo.isNeg = true;
cur.isNeg = a.isNeg;
quo.num.resize((int)a.num.size(), 0);
for (int i = a.num.size() - 1; i >= 0; i--) {
cur = cur * 10 + a.num[i];
while (cur >= b) {
cur -= b;
quo.num[i]++;
}
}
if (quo == 0)quo.isNeg = false;
if (cur == 0)cur.isNeg = false;
if (!mode)return quo.check();
else return cur.check();
}
INT operator/(INT a, INT b) {
return div(a, b, 0);
}
INT operator/=(INT& a, INT b) {
return a = div(a, b, 0);
}
INT operator%(INT a, INT b) {
return div(a, b, 1);
}
INT operator%=(INT& a, INT b) {
return a = div(a, b, 1);
}
INT operator++(INT &a) {
return a += 1;
}
INT operator--(INT &a) {
return a -= 1;
}
INT operator++(INT &a, int) {
INT t = a;
a += 1;
return t;
}
INT operator--(INT &a, int) {
INT t = a;
a -= 1;
return t;
}
INT tobinary(INT a) {
INT ret;
ret.isNeg = a.isNeg;
ret.isNumber = a.isNumber;
while (a != 0) {
ret.num.push_back(a.num[0] % 2);
a /= 2;
}
if (ret.isNeg) {
for (size_t i = 0; i < ret.num.size(); i++)ret.num[i] = !ret.num[i];
ret.num[0]++;
size_t i = 0;
while (ret.num[i] > 1 && i + 1 < ret.num.size())ret.num[i + 1]++, ret.num[i++] %= 2;
if (ret.num.back() > 1)ret.num.push_back(1), ret.num[ret.num.size() - 2] = ret.num.back() % 2;
}
return ret;
}
INT todecimal(INT a) {
INT res(0);
if (a.isNeg) {
a.num[0]--;
int i = 0;
while (res.num[i] < 0)res.num[i + 1]--, res.num[i++] += 2;
for (size_t i = 0; i < a.num.size(); i++)a.num[i] = !a.num[i];
}
for (int i = a.num.size() - 1; i >= 0; i--)res = res * 2 + a.num[i];
res.isNeg = a.isNeg;
return res.check();
}
INT operator&(INT a, INT b) {
a = tobinary(a);
b = tobinary(b);
INT res = a;
if (!res.isNeg)res.num.resize((int)b.num.size(), 0);
else res.num.resize((int)b.num.size(), 1);
for (size_t i = 0; i < res.num.size(); i++)res.num[i] &= b.num[i];
res.isNeg &= b.isNeg;
res = todecimal(res);
return res.check();
}
INT operator&=(INT& a, INT b) {
return a = a&b;
}
INT operator|(INT a, INT b) {
a = tobinary(a);
b = tobinary(b);
INT res = a;
if (!res.isNeg)res.num.resize((int)b.num.size(), 0);
else res.num.resize((int)b.num.size(), 1);
for (size_t i = 0; i < res.num.size(); i++)res.num[i] |= b.num[i];
res.isNeg |= b.isNeg;
res = todecimal(res);
return res.check();
}
INT operator|=(INT& a, INT b) {
return a = a | b;
}
INT operator~(INT a) {
a = tobinary(a);
INT res = a;
for (size_t i = 0; i < res.num.size(); i++)res.num[i] = !res.num[i];
res.isNeg = !res.isNeg;
res = todecimal(res);
return res.check();
}
INT operator^(INT a, INT b) {
a = tobinary(a);
b = tobinary(b);
INT res = a;
if (!res.isNeg)res.num.resize((int)b.num.size(), 0);
else res.num.resize((int)b.num.size(), 1);
for (size_t i = 0; i < res.num.size(); i++)res.num[i] ^= b.num[i];
res.isNeg ^= b.isNeg;
res = todecimal(res);
return res.check();
}
INT operator^=(INT& a, INT b) {
return a = a^b;
}
INT abs(INT a) {
return a < 0 ? -a : a;
}
INT pow(INT a, INT b) {
INT res = 1;
while (b != 0) {
if (b.num[0] % 2)res *= a;
a *= a;
b /= 2;
}
return res;
}
INT operator<<(INT a, INT b) {
return a*pow(2, b);
}
INT operator<<=(INT& a, INT b) {
return a = a << b;
}
INT operator>>(INT a, INT b) {
return a / pow(2, b);
}
INT operator>>=(INT& a, INT b) {
return a = a >> b;
}
INT a,b;
INT _gcd(INT a,INT b){
while(a%b!=0){
INT x=a%b;
a=b;
b=x;
}
return b;
}
给此代码添加压位功能
最新发布