退役选手ZlycerQan的强大的的高精度
1 #include <cstdio>
2 #include <iostream>
3 #include <vector>
4 #include <iomanip>
5 #include <cassert>
6 #include <algorithm>
7 #include <cstring>
8
9 const int Big_B = 1000000000;
10 const int Big_L = 9;
11 inline int intcmp_ (int a, int b) {
12 if (a > b) return 1;
13 return a < b ? -1 : 0;
14 }
15 struct Int {
16 #define rg register
17 inline int max (int a, int b) {
18 return a > b ? a : b;
19 }
20 inline int min (int a, int b) {
21 return a < b ? a : b;
22 }
23 std :: vector <int> c;
24 Int () {} typedef long long LL;
25 Int (int x) {
26 for (; x > 0; c.push_back (x % Big_B), x /= Big_B);
27 }
28 Int (LL x) {
29 for (; x > 0; c.push_back (x % Big_B), x /= Big_B);
30 }
31 inline void CrZ () {
32 for (; !c.empty () && c.back () == 0; c.pop_back ());
33 }
34 inline Int &operator += (const Int &rhs) {
35 c.resize (max (c.size (), rhs.c.size ()));
36 rg int i, t = 0, S;
37 for (i = 0, S = rhs.c.size (); i < S; ++ i)
38 c[i] += rhs.c[i] + t, t = c[i] >= Big_B, c[i] -= Big_B & (-t);
39 for (i = rhs.c.size (), S = c.size (); t && i < S; ++ i)
40 c[i] += t, t = c[i] >= Big_B, c[i] -= Big_B & (-t);
41 if (t) c.push_back (t);
42 return *this;
43 }
44 inline Int &operator -= (const Int &rhs) {
45 c.resize (max (c.size (), rhs.c.size ()));
46 rg int i, t = 0, S;
47 for (i = 0, S = rhs.c.size (); i < S; ++ i)
48 c[i] -= rhs.c[i] + t, t = c[i] < 0, c[i] += Big_B & (-t);
49 for (i = rhs.c.size (), S = c.size (); t && i < S; ++ i)
50 c[i] -= t, t = c[i] < 0, c[i] += Big_B & (-t);
51 CrZ ();
52 return *this;
53 }
54 inline Int &operator *= (const Int &rhs) {
55 rg int na = c.size (), i, j, S, ai;
56 c.resize (na + rhs.c.size ());
57 LL t;
58 for (i = na - 1; i >= 0; -- i) {
59 ai = c[i], t = 0, c[i] = 0;
60 for (j = 0, S = rhs.c.size (); j < S; ++ j) {
61 t += c[i + j] + (LL) ai * rhs.c[j];
62 c[i + j] = t % Big_B, t /= Big_B;
63 }
64 for (j = rhs.c.size (), S = c.size (); t != 0 && i + j < S; ++ j)
65 t += c[i + j], c[i + j] = t % Big_B, t /= Big_B;
66 assert (t == 0);
67 }
68 CrZ ();
69 return *this;
70 }
71 inline Int &operator /= (const Int &rhs) {
72 return *this = div (rhs);
73 }
74 inline Int &operator %= (const Int &rhs) {
75 return div (rhs), *this;
76 }
77 inline Int &shlb (int l = 1) {
78 if (c.empty ()) return *this;
79 c.resize (c.size () + l);
80 rg int i;
81 for (i = c.size () - 1; i >= l; -- i) c[i] = c[i - l];
82 for (i = 0; i < l; ++ i) c[i] = 0;
83 return *this;
84 }
85 inline Int &shrb (int l = 1) {
86 for (rg int i = 0; i < c.size () - l; ++ i) c[i] = c[i + l];
87 c.resize (max (c.size () - l, 0));
88 return *this;
89 }
90 inline int Comp (const Int &rhs) const {
91 if (c.size () != rhs.c.size ()) return intcmp_ (c.size (), rhs.c.size ());
92 for (rg int i = c.size () - 1; i >= 0; -- i)
93 if (c[i] != rhs.c[i]) return intcmp_ (c[i], rhs.c[i]);
94 return 0;
95 }
96 inline Int div (const Int &rhs) {
97 assert (!rhs.c.empty ());
98 Int q, r;
99 rg int i;
100 if (rhs > *this) return 0;
101 q.c.resize (c.size () - rhs.c.size () + 1);
102 rg int _l, _r, mid;
103 for (i = c.size () - 1; i > c.size () - rhs.c.size (); -- i) r.shlb (), r += c[i];
104 for (i = c.size () - rhs.c.size (); i >= 0; -- i) {
105 r.shlb ();
106 r += c[i];
107 if (r.Comp (rhs) < 0) q.c[i] = 0;
108 else {
109 _l = 0, _r = Big_B;
110 for (; _l != _r; ) {
111 mid = _l + _r >> 1;
112 if ((rhs * mid).Comp (r) <= 0) _l = mid + 1;
113 else _r = mid;
114 }
115 q.c[i] = _l - 1, r -= rhs * q.c[i];
116 }
117 }
118 q.CrZ (), *this = r;
119 return q;
120 }
121 friend inline Int operator + (const Int &lhs, const Int &rhs) {
122 Int res = lhs;
123 return res += rhs;
124 }
125 friend inline Int operator - (const Int &lhs, const Int &rhs) {
126 Int res = lhs;
127 return res -= rhs;
128 }
129 friend inline Int operator * (const Int &lhs, const Int &rhs) {
130 Int res = lhs;
131 return res *= rhs;
132 }
133 friend inline Int operator / (const Int &lhs, const Int &rhs) {
134 Int res = lhs;
135 return res.div (rhs);
136 }
137 friend inline Int operator % (const Int &lhs, const Int &rhs) {
138 Int res = lhs;
139 return res.div (rhs), res;
140 }
141 friend inline std :: ostream &operator << (std :: ostream &out, const Int &rhs) {
142 if (rhs.c.size () == 0) out << "0";
143 else {
144 out << rhs.c.back ();
145 for (rg int i = rhs.c.size () - 2; i >= 0; -- i)
146 out << std :: setfill ('0') << std :: setw (Big_L) << rhs.c[i];
147 }
148 return out;
149 }
150 friend inline std :: istream &operator >> (std :: istream &in, Int &rhs) {
151 static char s[10000];
152 in >> s + 1;
153 int Len = strlen (s + 1);
154 int v = 0;
155 LL r = 0, p = 1;
156 for (rg int i = Len; i >= 1; -- i) {
157 ++ v;
158 r = r + (s[i] - '0') * p, p *= 10;
159 if (v == Big_L) rhs.c.push_back (r), r = 0, v = 0, p = 1;
160 }
161 if (v != 0) rhs.c.push_back (r);
162 return in;
163 }
164 friend inline bool operator < (const Int &lhs, const Int &rhs) {
165 return lhs.Comp (rhs) < 0;
166 }
167 friend inline bool operator <= (const Int &lhs, const Int &rhs) {
168 return lhs.Comp (rhs) <= 0;
169 }
170 friend inline bool operator > (const Int &lhs, const Int &rhs) {
171 return lhs.Comp (rhs) > 0;
172 }
173 friend inline bool operator >= (const Int &lhs, const Int &rhs) {
174 return lhs.Comp (rhs) >= 0;
175 }
176 friend inline bool operator == (const Int &lhs, const Int &rhs) {
177 return lhs.Comp (rhs) == 0;
178 }
179 friend inline bool operator != (const Int &lhs, const Int &rhs) {
180 return lhs.Comp (rhs) != 0;
181 }
182 #undef rg
183 };
184 Int a;
185 int Main () {
186 return 0;
187 }
188 int ZlycerQan = Main ();
189 int main (int argc, char *argv[]) {
190 ;
191 }