Update CMakeLists.txt
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
#include <cmath>
|
||||
#include <iostream>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
using namespace std;
|
||||
|
||||
/// 只处理 500 位!
|
||||
class BigInt {
|
||||
public:
|
||||
using bigint = vector<unsigned long long>;
|
||||
static constexpr unsigned int BASE_DIGITS = 8;
|
||||
const unsigned long long BASE = static_cast<unsigned long long>(std::pow(10, BASE_DIGITS));
|
||||
static constexpr size_t TARGET_SIZE = 125;
|
||||
bigint value;
|
||||
|
||||
BigInt() : value({0}) { organize(); }
|
||||
BigInt(bigint v) : value(std::move(v)) { organize(); }
|
||||
|
||||
BigInt(unsigned long long v) {
|
||||
value.push_back(v);
|
||||
organize();
|
||||
}
|
||||
|
||||
void organize() {
|
||||
value.resize(TARGET_SIZE, 0);
|
||||
for (int i = 0; i < TARGET_SIZE - 1; i++) {
|
||||
value[i + 1] += value[i] / BASE;
|
||||
value[i] %= BASE;
|
||||
}
|
||||
value[TARGET_SIZE - 1] %= BASE;
|
||||
}
|
||||
|
||||
BigInt& operator=(const BigInt& other) {
|
||||
value = other.value;
|
||||
organize();
|
||||
return *this;
|
||||
}
|
||||
|
||||
BigInt operator*(const BigInt& other) const {
|
||||
BigInt ans(0);
|
||||
for (int i = 0; i < TARGET_SIZE; i++) {
|
||||
for (int j = 0; i + j < TARGET_SIZE; j++) {
|
||||
ans.value[i + j] += value[i] * other.value[j];
|
||||
}
|
||||
}
|
||||
ans.organize();
|
||||
return ans;
|
||||
}
|
||||
|
||||
BigInt operator*(const unsigned long other) const {
|
||||
BigInt ans(*this);
|
||||
ans.value[0] *= other;
|
||||
ans.organize();
|
||||
return ans;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
BigInt operator*=(const T& other) {
|
||||
*this = *this * other;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
[[nodiscard]] BigInt pow(unsigned int exp) const {
|
||||
if (exp == 0) { return {1}; }
|
||||
if (exp == 1) { return *this; }
|
||||
BigInt ans = (*this * *this).pow(exp / 2);
|
||||
if (exp % 2 == 1) {
|
||||
ans *= *this;
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
|
||||
[[nodiscard]] string to_string(size_t digits = 500) const {
|
||||
string s;
|
||||
for (int i = 0; i < TARGET_SIZE; i++) {
|
||||
string current = std::to_string(value[i]);
|
||||
if (current.size() < BASE_DIGITS) {
|
||||
current.insert(0, BASE_DIGITS - current.size(), '0');
|
||||
}
|
||||
s.insert(0, current);
|
||||
}
|
||||
return s.substr(s.size() - digits, s.size());
|
||||
}
|
||||
};
|
||||
|
||||
int main() {
|
||||
ios::sync_with_stdio(false);
|
||||
cin.tie(nullptr);
|
||||
|
||||
unsigned int exp;
|
||||
cin >> exp;
|
||||
cout << floor(exp * log10(2)) + 1 << endl;
|
||||
BigInt ans = BigInt(2).pow(exp);
|
||||
ans.value[0] -= 1; // 2^n 没问题
|
||||
string s = ans.to_string(500);
|
||||
for (int i = 0; i < 500; i += 50) {
|
||||
cout << s.substr(i, 50) << endl;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user