压位高精度模板
1.并查集模板2.求质因数模板3.二分图最大匹配模板(匈牙利算法)4.欧拉函数模板5.ST表模板6.快速幂模板7.字典树模板8.矩阵模板9.Dijkstra单源最短路模板10.最近公共祖先模板(LCA)11.拓扑排序模板12.区间素数筛模板13.Kruskal和Prim模板14.树状数组模板15.二维坐标离散化模板16.单点修改区间查最值-树状数组模板17.KMP模板18.二叉搜索树模板19.DIjkstra进阶模板 路径记录 按权重(结点数最小等)记录20.判断负环模板21.Exgcd 模板
22.压位高精度模板
23.线段树模板24.扫描线模板25.莫队模板26.带修莫队模板27.SCC缩点模板28.取模+组合数29.FFT 高精度乘法模板30.字符串自然溢出哈希/单哈希/双哈希模板31.树模板32.dsu on tree 模板33.线段树模板重制34.主席树模板35.大数质因数分解模板36.线段树合并模板37.int128输入输出流38.Meissel_Lehmer模板39.浮点高精度40.自适应辛普森法41.unordered_map随机底数种子struct BigInteger { static const int BASE = 100000000; static const int WIDTH = 8; vector<int> s; BigInteger(long long num = 0) { *this = num; } BigInteger(const string& str) { *this = str; } BigInteger operator = (long long num) { s.clear(); do { s.push_back(num % BASE); num /= BASE; } while (num > 0); return *this; } BigInteger operator = (const string& str) { s.clear(); int x, len = (str.length() - 1) / WIDTH + 1; for (int i = 0; i < len; i++) { int end = str.length() - i * WIDTH; int start = max(0, end - WIDTH); sscanf(str.substr(start, end - start).c_str(), "%d", &x); s.push_back(x); } return *this; } bool operator < (const BigInteger& b) const { if (s.size() != b.s.size()) return s.size() < b.s.size(); for (int i = s.size() - 1; i >= 0; i--) if (s[i] != b.s[i]) return s[i] < b.s[i]; return false; } bool operator > (const BigInteger& b) const { return b < *this; } bool operator <= (const BigInteger& b) const { return !(b < *this); } bool operator >= (const BigInteger& b) const { return !(*this < b); } bool operator != (const BigInteger& b) const { return b < *this || *this < b; } bool operator == (const BigInteger& b) const { return !(b < *this) && !(*this < b); } BigInteger operator + (const BigInteger& b) const { BigInteger c; c.s.clear(); for (int i = 0, g = 0; ; i++) { if (g == 0 && i >= s.size() && i >= b.s.size()) break; int x = g; if (i < s.size()) x += s[i]; if (i < b.s.size()) x += b.s[i]; c.s.push_back(x % BASE); g = x / BASE; } return c; } BigInteger operator - (const BigInteger& b) const { BigInteger c; c.s.clear(); if (*this == b) { c.s.push_back(0); } else if (*this < b) { for (int i = 0, g = 0; ; i++) { if (g == 0 && i >= b.s.size() && i >= s.size()) { c.s[i - 1] = -c.s[i - 1]; break; } int x = g; if (i < b.s.size()) x += b.s[i]; if (i < s.size()) x -= s[i]; if (x < 0) { c.s.push_back(BASE + x % BASE); g = x / BASE - 1; } else { c.s.push_back(x % BASE); g = x / BASE; } } } else { for (int i = 0, g = 0; ; i++) { if (g == 0 && i >= s.size() && i >= b.s.size()) break; int x = g; if (i < s.size()) x += s[i]; if (i < b.s.size()) x -= b.s[i]; if (x < 0) { c.s.push_back(BASE + x % BASE); g = x / BASE - 1; } else { c.s.push_back(x % BASE); g = x / BASE; } } } return c; } BigInteger operator * (const BigInteger& b) const { BigInteger c; int len = s.size() + b.s.size(); bool flag = false; c.s.clear(); if (*this == 0 || b == 0) {c.s.push_back(0); return 0;} if (*this < 0 && b > 0) flag = true; if (*this > 0 && b < 0) flag = true; for (int i = 0, g = 0; ; i++) { if (g == 0 && i >= len) break; int x = g; for (int u = 0, v = i, temp; v >= 0; u++, v--) if (u < s.size() && v < b.s.size()) { temp = s[u] * b.s[v]; if (temp < 0) temp = -temp; x += temp; } c.s.push_back(x % BASE); g = x / BASE; } for (int i = c.s.size() - 1; i >= 0 && c.s[i] == 0; i--) c.s.pop_back(); if (flag) c.s[c.s.size() - 1] = -c.s[c.s.size() - 1]; return c; } inline void killzero() { while (s.back() == 0 && s.size() > 1) s.pop_back(); } inline void reverse() { int len = s.size(); for (int i = 0; i < len >> 1; ++i) swap(s[i], s[len - i - 1]); } BigInteger operator / (const BigInteger &b) const { BigInteger c, t; c.s.clear(); t.s.clear(); for (int i = s.size() - 1; i >= 0; --i) { t.s.push_back(s[i]); int x = 0; while (b <= t) {t -= b; x++;} c.s.push_back(x); } c.reverse(); c.killzero(); return c; } BigInteger operator / (const int &b) const { BigInteger c; c.s.clear(); int r = 0; for (int i = s.size() - 1; i >= 0; --i) { r = r * BASE + s[i]; c.s.push_back(r / b); r %= b; } c.reverse(); c.killzero(); return c; } BigInteger operator += (const BigInteger& b) { *this = *this + b; return *this; } BigInteger operator ++ (int) { *this = *this + 1; return *this; } BigInteger operator ++ () { *this = *this + 1; return *this; } BigInteger operator -= (const BigInteger& b) { *this = *this - b; return *this; } BigInteger operator -- (int) { *this = *this - 1; return *this; } BigInteger operator -- () { *this = *this - 1; return *this; } BigInteger operator *= (const BigInteger& b) { *this = *this * b; return *this; } BigInteger operator /= (const BigInteger& b) { *this = *this / b; return *this; } friend ostream& operator << (ostream& out, const BigInteger& x) { out << x.s.back(); for (int i = x.s.size() - 2; i >= 0; i--) { char buf[20]; sprintf(buf, "%08d", x.s[i]); for (int j = 0; j < strlen(buf); j++) out << buf[j]; } return out; } friend istream& operator >> (istream& in, BigInteger& x) { string s; if (!(in >> s)) return in; x = s; return in; } };
本文作者:Ke_scholar
本文链接:https://www.cnblogs.com/Kescholar/p/18175441
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步