Advertisement
Guest User

Untitled

a guest
Feb 7th, 2016
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.09 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <string>
  6. #include <cctype>
  7. #include <stack>
  8. #include <queue>
  9. #include <list>
  10. #include <vector>
  11. #include <map>
  12. #include <sstream>
  13. #include <utility>
  14. #include <set>
  15. #include <math.h>
  16. #include <queue>
  17. #include <string.h>
  18. #include <iomanip>
  19.  
  20. using namespace std;
  21. const int base = 1000000000;
  22. const int base_digits = 9;
  23. struct bigint {
  24. vector<int> a;
  25. int sign;
  26. /*<arpa>*/
  27. int size(){
  28. if(a.empty())return 0;
  29. int ans=(a.size()-1)*base_digits;
  30. int ca=a.back();
  31. while(ca)
  32. ans++,ca/=10;
  33. return ans;
  34. }
  35. bigint operator ^(const bigint &v){
  36. bigint ans=1,a=*this,b=v;
  37. while(!b.isZero()){
  38. if(b%2)
  39. ans*=a;
  40. a*=a,b/=2;
  41. }
  42. return ans;
  43. }
  44. /*</arpa>*/
  45. bigint() :
  46. sign(1) {
  47. }
  48.  
  49. bigint(long long v) {
  50. *this = v;
  51. }
  52.  
  53. bigint(const string &s) {
  54. read(s);
  55. }
  56.  
  57. void operator=(const bigint &v) {
  58. sign = v.sign;
  59. a = v.a;
  60. }
  61.  
  62. void operator=(long long v) {
  63. sign = 1;
  64. if (v < 0)
  65. sign = -1, v = -v;
  66. for (; v > 0; v = v / base)
  67. a.push_back(v % base);
  68. }
  69.  
  70. bigint operator+(const bigint &v) const {
  71. if (sign == v.sign) {
  72. bigint res = v;
  73.  
  74. for (int i = 0, carry = 0; i < (int) max(a.size(), v.a.size()) || carry; ++i) {
  75. if (i == (int) res.a.size())
  76. res.a.push_back(0);
  77. res.a[i] += carry + (i < (int) a.size() ? a[i] : 0);
  78. carry = res.a[i] >= base;
  79. if (carry)
  80. res.a[i] -= base;
  81. }
  82. return res;
  83. }
  84. return *this - (-v);
  85. }
  86.  
  87. bigint operator-(const bigint &v) const {
  88. if (sign == v.sign) {
  89. if (abs() >= v.abs()) {
  90. bigint res = *this;
  91. for (int i = 0, carry = 0; i < (int) v.a.size() || carry; ++i) {
  92. res.a[i] -= carry + (i < (int) v.a.size() ? v.a[i] : 0);
  93. carry = res.a[i] < 0;
  94. if (carry)
  95. res.a[i] += base;
  96. }
  97. res.trim();
  98. return res;
  99. }
  100. return -(v - *this);
  101. }
  102. return *this + (-v);
  103. }
  104.  
  105. void operator*=(int v) {
  106. if (v < 0)
  107. sign = -sign, v = -v;
  108. for (int i = 0, carry = 0; i < (int) a.size() || carry; ++i) {
  109. if (i == (int) a.size())
  110. a.push_back(0);
  111. long long cur = a[i] * (long long) v + carry;
  112. carry = (int) (cur / base);
  113. a[i] = (int) (cur % base);
  114. //asm("divl %%ecx" : "=a"(carry), "=d"(a[i]) : "A"(cur), "c"(base));
  115. }
  116. trim();
  117. }
  118.  
  119. bigint operator*(int v) const {
  120. bigint res = *this;
  121. res *= v;
  122. return res;
  123. }
  124.  
  125. friend pair<bigint, bigint> divmod(const bigint &a1, const bigint &b1) {
  126. int norm = base / (b1.a.back() + 1);
  127. bigint a = a1.abs() * norm;
  128. bigint b = b1.abs() * norm;
  129. bigint q, r;
  130. q.a.resize(a.a.size());
  131.  
  132. for (int i = a.a.size() - 1; i >= 0; i--) {
  133. r *= base;
  134. r += a.a[i];
  135. int s1 = r.a.size() <= b.a.size() ? 0 : r.a[b.a.size()];
  136. int s2 = r.a.size() <= b.a.size() - 1 ? 0 : r.a[b.a.size() - 1];
  137. int d = ((long long) base * s1 + s2) / b.a.back();
  138. r -= b * d;
  139. while (r < 0)
  140. r += b, --d;
  141. q.a[i] = d;
  142. }
  143.  
  144. q.sign = a1.sign * b1.sign;
  145. r.sign = a1.sign;
  146. q.trim();
  147. r.trim();
  148. return make_pair(q, r / norm);
  149. }
  150.  
  151. bigint operator/(const bigint &v) const {
  152. return divmod(*this, v).first;
  153. }
  154.  
  155. bigint operator%(const bigint &v) const {
  156. return divmod(*this, v).second;
  157. }
  158.  
  159. void operator/=(int v) {
  160. if (v < 0)
  161. sign = -sign, v = -v;
  162. for (int i = (int) a.size() - 1, rem = 0; i >= 0; --i) {
  163. long long cur = a[i] + rem * (long long) base;
  164. a[i] = (int) (cur / v);
  165. rem = (int) (cur % v);
  166. }
  167. trim();
  168. }
  169.  
  170. bigint operator/(int v) const {
  171. bigint res = *this;
  172. res /= v;
  173. return res;
  174. }
  175.  
  176. int operator%(int v) const {
  177. if (v < 0)
  178. v = -v;
  179. int m = 0;
  180. for (int i = a.size() - 1; i >= 0; --i)
  181. m = (a[i] + m * (long long) base) % v;
  182. return m * sign;
  183. }
  184.  
  185. void operator+=(const bigint &v) {
  186. *this = *this + v;
  187. }
  188. void operator-=(const bigint &v) {
  189. *this = *this - v;
  190. }
  191. void operator*=(const bigint &v) {
  192. *this = *this * v;
  193. }
  194. void operator/=(const bigint &v) {
  195. *this = *this / v;
  196. }
  197.  
  198. bool operator<(const bigint &v) const {
  199. if (sign != v.sign)
  200. return sign < v.sign;
  201. if (a.size() != v.a.size())
  202. return a.size() * sign < v.a.size() * v.sign;
  203. for (int i = a.size() - 1; i >= 0; i--)
  204. if (a[i] != v.a[i])
  205. return a[i] * sign < v.a[i] * sign;
  206. return false;
  207. }
  208.  
  209. bool operator>(const bigint &v) const {
  210. return v < *this;
  211. }
  212. bool operator<=(const bigint &v) const {
  213. return !(v < *this);
  214. }
  215. bool operator>=(const bigint &v) const {
  216. return !(*this < v);
  217. }
  218. bool operator==(const bigint &v) const {
  219. return !(*this < v) && !(v < *this);
  220. }
  221. bool operator!=(const bigint &v) const {
  222. return *this < v || v < *this;
  223. }
  224.  
  225. void trim() {
  226. while (!a.empty() && !a.back())
  227. a.pop_back();
  228. if (a.empty())
  229. sign = 1;
  230. }
  231.  
  232. bool isZero() const {
  233. return a.empty() || (a.size() == 1 && !a[0]);
  234. }
  235.  
  236. bigint operator-() const {
  237. bigint res = *this;
  238. res.sign = -sign;
  239. return res;
  240. }
  241.  
  242. bigint abs() const {
  243. bigint res = *this;
  244. res.sign *= res.sign;
  245. return res;
  246. }
  247.  
  248. long long longValue() const {
  249. long long res = 0;
  250. for (int i = a.size() - 1; i >= 0; i--)
  251. res = res * base + a[i];
  252. return res * sign;
  253. }
  254.  
  255. friend bigint gcd(const bigint &a, const bigint &b) {
  256. return b.isZero() ? a : gcd(b, a % b);
  257. }
  258. friend bigint lcm(const bigint &a, const bigint &b) {
  259. return a / gcd(a, b) * b;
  260. }
  261.  
  262. void read(const string &s) {
  263. sign = 1;
  264. a.clear();
  265. int pos = 0;
  266. while (pos < (int) s.size() && (s[pos] == '-' || s[pos] == '+')) {
  267. if (s[pos] == '-')
  268. sign = -sign;
  269. ++pos;
  270. }
  271. for (int i = s.size() - 1; i >= pos; i -= base_digits) {
  272. int x = 0;
  273. for (int j = max(pos, i - base_digits + 1); j <= i; j++)
  274. x = x * 10 + s[j] - '0';
  275. a.push_back(x);
  276. }
  277. trim();
  278. }
  279.  
  280. friend istream& operator>>(istream &stream, bigint &v) {
  281. string s;
  282. stream >> s;
  283. v.read(s);
  284. return stream;
  285. }
  286.  
  287. friend ostream& operator<<(ostream &stream, const bigint &v) {
  288. if (v.sign == -1)
  289. stream << '-';
  290. stream << (v.a.empty() ? 0 : v.a.back());
  291. for (int i = (int) v.a.size() - 2; i >= 0; --i)
  292. stream << setw(base_digits) << setfill('0') << v.a[i];
  293. return stream;
  294. }
  295.  
  296. static vector<int> convert_base(const vector<int> &a, int old_digits, int new_digits) {
  297. vector<long long> p(max(old_digits, new_digits) + 1);
  298. p[0] = 1;
  299. for (int i = 1; i < (int) p.size(); i++)
  300. p[i] = p[i - 1] * 10;
  301. vector<int> res;
  302. long long cur = 0;
  303. int cur_digits = 0;
  304. for (int i = 0; i < (int) a.size(); i++) {
  305. cur += a[i] * p[cur_digits];
  306. cur_digits += old_digits;
  307. while (cur_digits >= new_digits) {
  308. res.push_back(int(cur % p[new_digits]));
  309. cur /= p[new_digits];
  310. cur_digits -= new_digits;
  311. }
  312. }
  313. res.push_back((int) cur);
  314. while (!res.empty() && !res.back())
  315. res.pop_back();
  316. return res;
  317. }
  318.  
  319. typedef vector<long long> vll;
  320.  
  321. static vll karatsubaMultiply(const vll &a, const vll &b) {
  322. int n = a.size();
  323. vll res(n + n);
  324. if (n <= 32) {
  325. for (int i = 0; i < n; i++)
  326. for (int j = 0; j < n; j++)
  327. res[i + j] += a[i] * b[j];
  328. return res;
  329. }
  330.  
  331. int k = n >> 1;
  332. vll a1(a.begin(), a.begin() + k);
  333. vll a2(a.begin() + k, a.end());
  334. vll b1(b.begin(), b.begin() + k);
  335. vll b2(b.begin() + k, b.end());
  336.  
  337. vll a1b1 = karatsubaMultiply(a1, b1);
  338. vll a2b2 = karatsubaMultiply(a2, b2);
  339.  
  340. for (int i = 0; i < k; i++)
  341. a2[i] += a1[i];
  342. for (int i = 0; i < k; i++)
  343. b2[i] += b1[i];
  344.  
  345. vll r = karatsubaMultiply(a2, b2);
  346. for (int i = 0; i < (int) a1b1.size(); i++)
  347. r[i] -= a1b1[i];
  348. for (int i = 0; i < (int) a2b2.size(); i++)
  349. r[i] -= a2b2[i];
  350.  
  351. for (int i = 0; i < (int) r.size(); i++)
  352. res[i + k] += r[i];
  353. for (int i = 0; i < (int) a1b1.size(); i++)
  354. res[i] += a1b1[i];
  355. for (int i = 0; i < (int) a2b2.size(); i++)
  356. res[i + n] += a2b2[i];
  357. return res;
  358. }
  359.  
  360. bigint operator*(const bigint &v) const {
  361. vector<int> a6 = convert_base(this->a, base_digits, 6);
  362. vector<int> b6 = convert_base(v.a, base_digits, 6);
  363. vll a(a6.begin(), a6.end());
  364. vll b(b6.begin(), b6.end());
  365. while (a.size() < b.size())
  366. a.push_back(0);
  367. while (b.size() < a.size())
  368. b.push_back(0);
  369. while (a.size() & (a.size() - 1))
  370. a.push_back(0), b.push_back(0);
  371. vll c = karatsubaMultiply(a, b);
  372. bigint res;
  373. res.sign = sign * v.sign;
  374. for (int i = 0, carry = 0; i < (int) c.size(); i++) {
  375. long long cur = c[i] + carry;
  376. res.a.push_back((int) (cur % 1000000));
  377. carry = (int) (cur / 1000000);
  378. }
  379. res.a = convert_base(res.a, 6, base_digits);
  380. res.trim();
  381. return res;
  382. }
  383. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement