50求助
查看原帖
50求助
571740
yuhaoran666楼主2022/5/21 23:05
#include<bits/stdc++.h>
using namespace std;
// ------------------------------ superint ------------------------------
#define MAX 5000
struct superint {
	short num[MAX];
	superint & operator = (const char*);
	superint & operator = (int);
	superint();
	superint(int);
	bool operator > (const superint &) const;
	bool operator < (const superint &) const;
	bool operator <= (const superint &) const;
	bool operator >= (const superint &) const;
	bool operator != (const superint &) const;
	bool operator == (const superint &) const;
	superint operator + (const superint &) const;
	superint operator - (const superint &) const;
	superint operator * (const superint &) const;
	superint operator / (const superint &) const;
	superint operator % (const superint &) const;
	superint operator += (const superint &);
	superint operator -= (const superint &);
	superint operator *= (const superint &);
	superint operator /= (const superint &);
	superint operator %= (const superint &);
	void pow(superint n) {
		superint ret, i;
		i = 1;
		ret = 1;
		for (; i <= n; i += 1) ret *= *this;
		*this = ret;
	}
};
superint & superint::operator = (const char* c) {
	memset(num, 0, sizeof(num));
	int n = strlen(c), j = 1, k = 1;
	for (int i = 1; i <= n; i ++ ) {
		if (k == 10000) j++, k = 1;
		num[j] += k * (c[n - i] - '0');
		k *= 10;
	}
	num[0] = j;
	return *this;
}
superint & superint::operator = (int a) {
	char s[MAX];
	sprintf(s, "%d", a);
	return *this = s;
}
superint::superint() {
	memset(num, 0, sizeof(num));
	num[0] = 1;
}
superint::superint(int n) {
	*this = n;
}
bool superint::operator > (const superint &b) const {
	if (num[0] != b.num[0]) return num[0] > b.num[0];
	for (int i = num[0]; i >= 1; i--) {
		if (num[i] != b.num[i]) {
			return (num[i] > b.num[i]);
		}
	}
	return false;
}
bool superint::operator < (const superint &b) const {
	return b > *this;
}
bool superint::operator <= (const superint &b) const {
	return !(*this > b);
}
bool superint::operator >= (const superint &b) const {
	return !(b > *this);
}
bool superint::operator != (const superint &b) const {
	return (b > *this) || (*this > b);
}
bool superint::operator == (const superint &b) const {
	return !(b > *this) && !(*this > b);
}
superint superint::operator + (const superint &b) const {
	superint c;
	c.num[0] = max(num[0], b.num[0]);
	for (int i = 1; i <= c.num[0]; i++) {
		c.num[i] += num[i] + b.num[i];
		if (c.num[i] >= 10000) {
			c.num[i] -= 10000;
			c.num[i + 1]++;
		}
	}
	if (c.num[c.num[0] + 1] > 0) c.num[0]++;
	return c;
}
superint superint::operator - (const superint &b) const {
	superint c;
	c.num[0] = num[0];
	for (int i = 1; i <= c.num[0]; i++) {
		c.num[i] += num[i] - b.num[i];
		if (c.num[i] < 0) {
			c.num[i] += 10000;
			c.num[i + 1]--;
		}
	}
	while (c.num[c.num[0]] == 0 && c.num[0] > 1) c.num[0]--;
	return c;
}
superint superint::operator += (const superint &b) {
	return *this = *this + b;
}
superint superint::operator -= (const superint &b) {
	return *this = *this - b;
}
superint superint::operator * (const superint &b) const {
	superint c;
	c.num[0] = num[0] + b.num[0] + 1;
	for (int i = 1; i <= num[0]; i++) {
		for (int j = 1; j <= b.num[0]; j++) {
			c.num[i + j - 1] += num[i] * b.num[j];
			c.num[i + j] += c.num[i + j - 1] / 10000;
			c.num[i + j - 1] %= 10000;
		}
	}
	while (c.num[c.num[0]] == 0 && c.num[0] > 1) c.num[0]--;
	return c;
}
superint superint::operator *= (const superint &b) {
	return *this = *this*b;
}
superint superint::operator / (const superint &b) const {
	superint c, d;
	c.num[0] = num[0] + b.num[0] + 1;
	d.num[0] = 0;
	for (int i = num[0]; i >= 1; i--) {
		memmove(d.num + 2, d.num + 1, sizeof(d.num) - sizeof(int) * 2);
		d.num[0]++;
		d.num[1] = num[i];
		int left = 0, right = 9999, mid;
		while (left < right) {
			mid = (left + right) / 2;
			if (b * superint(mid) <= d) left = mid + 1;
			else right = mid;
		}
		c.num[i] = right - 1;
		d = d - b * superint(right - 1);
	}
	while (c.num[c.num[0]] == 0 && c.num[0] > 1) c.num[0]--;
	return c;
}
superint superint::operator % (const superint &b) const {
	superint c, d;
	c.num[0] = num[0] + b.num[0] + 1;
	d.num[0] = 0;
	for (int i = num[0]; i >= 1; i--) {
		memmove(d.num + 2, d.num + 1, sizeof(d.num) - sizeof(int) * 2);
		d.num[0]++;
		d.num[1] = num[i];
		int left = 0, right = 9999, mid;
		while (left < right) {
			mid = (left + right) / 2;
			if (b * superint(mid) <= d) left = mid + 1;
			else right = mid;
		}
		c.num[i] = right - 1;
		d =d - b * superint(right - 1);
	}
	while (c.num[c.num[0]] == 0 && c.num[0] > 1) c.num[0]--;
	return d;

}
superint superint::operator /= (const superint &b) {
	return *this = *this / b;
}
superint superint::operator %= (const superint &b) {
	return *this = *this % b;
}
ostream & operator << (ostream &out, superint &n) {
    stringstream st1;
    st1 << n.num[n.num[0]];
    string s1;
    st1 >> s1;
	cout << n.num[0] * 4 - 4 + s1.length() << endl;
	// ---------------------------------------
	stringstream st;
	for (int i = 125; i >= 1; i--) {
		st.width(4);
		st.fill('0');
		st << n.num[i];
	}
	string s;
	st >> s;
	int l = s.length();
	for (int i = 0; i < l; i += 50) {
		for (int j = i; j <= i + 49; j++) cout << s[j];
		cout << endl;
	}
	return out;
}
istream & operator >> (istream &in, superint &n) {
	char s[MAX];
	in >> s;
	n = s;
	return in;
}
// ------------------------------ end ------------------------------
// 主函数 
superint p;
int main() {
	cin >> p;
	if (p <= 20000);
	else if (p <= 1000000) {
		#undef MAX
		#define MAX 500000
	}
	else {
		#undef MAX
		#define MAX 775000
	}
	superint num, sum;
	num = 2;
	num.pow(p);
	num -= 1;
	cout << num;
	return 0;
}
2022/5/21 23:05
加载中...