codevs 2803 爱丽丝·玛格特罗依德

二次联通门 : codevs 2803 爱丽丝·玛格特罗依德

/*
    codevs 2803 爱丽丝·玛格特罗伊德
    
   高精 + 找规律

显然, 能拆3就多拆3 不能拆就拆2 注意特判一下
*/ #include <iostream> #include <cstdio> #include <vector> #include <iomanip> #include <cassert> #include <algorithm> #define int64 long long using namespace std; #define Max 105 const int B = 1000000000; const int L = 9; inline int intcmp(int a, int b) { if (a > b) return 1; else if (a < b) return -1; else return 0; } void read (int &now) { now = 0; register char word = getchar (); while (word < '0' || word > '9') word = getchar (); while (word >= '0' && word <= '9') { now = now * 10 + word - '0'; word = getchar (); } } struct BigInt { vector<int> a; BigInt(){} BigInt(int n) { while (n > 0) a.push_back(n % B), n /= B; } BigInt(int64 n) { while (n > 0) a.push_back(n % B), n /= B; } inline void clr0() { while (!a.empty() && a.back() == 0) a.pop_back(); } inline BigInt &operator+=(const BigInt &rhs) { a.resize(max(a.size(), rhs.a.size())); int t = 0; for (int i = 0; i < (int)rhs.a.size(); i++) { a[i] += rhs.a[i] + t; t = a[i] >= B; a[i] -= B & (-t); } for (int i = (int)rhs.a.size(); t != 0 && i < (int)a.size(); i++) { a[i] += t; t = a[i] >= B; a[i] -= B & (-t); } if (t != 0) a.push_back(t); return *this; } inline BigInt &operator-=(const BigInt &rhs) { a.resize(max(a.size(), rhs.a.size())); int t = 0; for (int i = 0; i < (int)rhs.a.size(); i++) { a[i] -= rhs.a[i] + t; t = a[i] < 0; a[i] += B & (-t); } for (int i = (int)rhs.a.size(); t != 0 && i < (int)a.size(); i++) { a[i] -= t; t = a[i] < 0; a[i] += B & (-t); } clr0(); return *this; } inline BigInt &operator*=(const BigInt &rhs) { int na = (int)a.size(); a.resize(na + rhs.a.size()); for (int i = na - 1; i >= 0; i--) { int ai = a[i]; int64 t = 0; a[i] = 0; for (int j = 0; j < (int)rhs.a.size(); j++) { t += a[i + j] + (int64)ai * rhs.a[j]; a[i + j] = t % B; t /= B; } for (int j = (int)rhs.a.size(); t != 0 && i + j < (int)a.size(); j++) { t += a[i + j]; a[i + j] = t % B; t /= B; } assert(t == 0); } clr0(); return *this; } inline BigInt &operator/=(const BigInt &rhs) { return *this = div(rhs); } inline BigInt &operator%=(const BigInt &rhs) { return div(rhs), *this; } inline BigInt &shlb(int l = 1) { if (a.empty()) return *this; a.resize(a.size() + l); for (int i = (int)a.size() - 1; i >= l; i--) a[i] = a[i - l]; for (int i = 0; i < l; i++) a[i] = 0; return *this; } inline BigInt &shrb(int l = 1) { for (int i = 0; i < (int)a.size() - l; i++) a[i] = a[i + l]; a.resize(max((int)a.size() - l, 0)); return *this; } inline int cmp(const BigInt &rhs) const { if (a.size() != rhs.a.size()) return intcmp(a.size(), rhs.a.size()); for (int i = (int)a.size() - 1; i >= 0; i--) if (a[i] != rhs.a[i]) return intcmp(a[i], rhs.a[i]); return 0; } inline BigInt div(const BigInt &rhs) { assert(!rhs.a.empty()); if (rhs > *this) return 0; BigInt q, r; q.a.resize((int)a.size() - (int)rhs.a.size() + 1); for (int i = (int)a.size() - 1; i > (int)a.size() - (int)rhs.a.size(); i--) { r.shlb(); r += a[i]; } for (int i = (int)a.size() - (int)rhs.a.size(); i >= 0; i--) { r.shlb(); r += a[i]; if (r.cmp(rhs) < 0) q.a[i] = 0; else { int le = 0, ri = B; while (le != ri) { int mi = (le + ri) / 2; if ((rhs * mi).cmp(r) <= 0) le = mi + 1; else ri = mi; } q.a[i] = le - 1; r -= rhs * q.a[i]; } } q.clr0(); *this = r; return q; } friend inline BigInt operator+(const BigInt &lhs, const BigInt &rhs) { BigInt res = lhs; return res += rhs; } friend inline BigInt operator-(const BigInt &lhs, const BigInt &rhs) { BigInt res = lhs; return res -= rhs; } friend inline BigInt operator*(const BigInt &lhs, const BigInt &rhs) { BigInt res = lhs; return res *= rhs; } friend inline BigInt operator/(const BigInt &lhs, const BigInt &rhs) { BigInt res = lhs; return res.div(rhs); } friend inline BigInt operator%(const BigInt &lhs, const BigInt &rhs) { BigInt res = lhs; return res.div(rhs), res; } friend inline ostream &operator<<(ostream &out, const BigInt &rhs) { if (rhs.a.size() == 0) out << "0"; else { out << rhs.a.back(); for (int i = (int)rhs.a.size() - 2; i >= 0; i--) out << setfill('0') << setw(L) << rhs.a[i]; } return out; } friend inline bool operator<(const BigInt &lhs, const BigInt &rhs) { return lhs.cmp(rhs) < 0; } friend inline bool operator<=(const BigInt &lhs, const BigInt &rhs) { return lhs.cmp(rhs) <= 0; } friend inline bool operator>(const BigInt &lhs, const BigInt &rhs) { return lhs.cmp(rhs) > 0; } friend inline bool operator>=(const BigInt &lhs, const BigInt &rhs) { return lhs.cmp(rhs) >= 0; } friend inline bool operator==(const BigInt &lhs, const BigInt &rhs) { return lhs.cmp(rhs) == 0; } friend inline bool operator!=(const BigInt &lhs, const BigInt &rhs) { return lhs.cmp(rhs) != 0; } }; int N; BigInt Answer = 1; int main (int argc, char *argv[]) { for (read (N); N; ) { if (N == 4) { N -= 4; Answer *= 4; } else if (N >= 3) { N -= 3; Answer *= 3; } else if (N == 2) { N -= 2; Answer *= 2; } else if (N == 1) { puts ("1"); return 0; } } cout << Answer; return 0; }
原文地址:https://www.cnblogs.com/ZlycerQan/p/7220212.html