Advertisement
GerONSo

Untitled

Dec 7th, 2020
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.34 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4.  
  5. struct Multiplicator {
  6. void simple_multiply(std::vector<int>& a, std::vector<int>& b, std::vector<int>& res) {
  7. res.resize(a.size() + b.size());
  8. for(std::size_t i = 0; i < b.size(); i++) {
  9. for(std::size_t j = 0; j < a.size(); j++) {
  10. res[i + j] += b[i] * a[j];
  11. }
  12. }
  13. }
  14.  
  15. void sum(std::vector<int>& a, std::vector<int>& b, std::vector<int>& res) {
  16. res.resize(std::max(a.size(), b.size()));
  17. if(a.size() < b.size()) {
  18. std::swap(a, b);
  19. }
  20. res = a;
  21. for(std::size_t i = 0; i < b.size(); i++) {
  22. res[i] += b[i];
  23. }
  24. }
  25.  
  26. void decrease(std::vector<int>& a, std::vector<int>& b, std::vector<int>& res) {
  27. res.resize(std::max(a.size(), b.size()));
  28. res = a;
  29. for(std::size_t i = 0; i < b.size(); i++) {
  30. res[i] -= b[i];
  31. }
  32. }
  33.  
  34. void prepareNumbers(std::vector<int>& a, std::vector<int>& b, std::vector<int>& res) {
  35. if(a.size() < b.size()) {
  36. std::swap(a, b);
  37. }
  38.  
  39. while(b.size() < a.size()) {
  40. b.push_back(0);
  41. }
  42. while((b.size() & 1)) {
  43. a.push_back(0);
  44. b.push_back(0);
  45. }
  46. }
  47.  
  48. void split(std::vector<int>& al, std::vector<int>& ar,
  49. std::vector<int>& bl, std::vector<int>& br,
  50. std::vector<int>& a, std::vector<int>& b, int mid) {
  51. for(std::size_t i = 0; i < a.size(); i++) {
  52. if(i < mid) {
  53. al.push_back(a[i]);
  54. bl.push_back(b[i]);
  55. }
  56. else {
  57. ar.push_back(a[i]);
  58. br.push_back(b[i]);
  59. }
  60. }
  61. }
  62.  
  63. void reverseParts(std::vector<int>& r1, std::vector<int>& r2, std::vector<int>& r4) {
  64. reverse(r1.begin(), r1.end());
  65. reverse(r2.begin(), r2.end());
  66. reverse(r4.begin(), r4.end());
  67. }
  68.  
  69. void multiplyParts(std::vector<int>& r1, std::vector<int>& r2,
  70. std::vector<int>& r4, std::vector<int>& al,
  71. std::vector<int>& bl, std::vector<int>& kl,
  72. std::vector<int>& kr, std::vector<int>& ar,
  73. std::vector<int>& br) {
  74. multiply(al, bl, r1);
  75. multiply(kl, kr, r2);
  76. multiply(ar, br, r4);
  77. }
  78.  
  79. void sumParts(std::vector<int>& al, std::vector<int>& bl,
  80. std::vector<int>& kl, std::vector<int>& kr,
  81. std::vector<int>& ar, std::vector<int>& br) {
  82. sum(al, ar, kl);
  83. sum(bl, br, kr);
  84. }
  85.  
  86. void multiply(std::vector<int>& a, std::vector<int>& b, std::vector<int>& res) {
  87. if(std::max(a.size(), b.size()) < 100) {
  88. simple_multiply(a, b, res);
  89. return;
  90. }
  91. prepareNumbers(a, b, res);
  92. int mid = a.size() / 2;
  93. std::vector<int> al;
  94. std::vector<int> ar;
  95. std::vector<int> bl;
  96. std::vector<int> br;
  97. split(al, ar, bl, br, a, b, mid);
  98. std::vector<int> r1;
  99. std::vector<int> r2;
  100. std::vector<int> r3;
  101. std::vector<int> r4;
  102. std::vector<int> kl;
  103. std::vector<int> kr;
  104. sumParts(al, bl, kl, kr, ar, br);
  105. multiplyParts(r1, r2, r4, al, bl, kl, kr, ar, br);
  106. reverseParts(r1, r2, r4);
  107. decrease(r2, r1, r3);
  108. decrease(r3, r4, r2);
  109. for(std::size_t i = 0; i < mid; i++) {
  110. r2.push_back(0);
  111. }
  112. for(std::size_t i = 0; i < 2 * mid; i++) {
  113. r4.push_back(0);
  114. }
  115. reverseParts(r1, r2, r4);
  116. sum(r1, r2, res);
  117. std::vector<int> res2;
  118. sum(res, r4, res2);
  119. res = res2;
  120. }
  121. };
  122.  
  123. class BigInteger {
  124. private:
  125. std::vector<int> base;
  126. bool negative = 0;
  127. public:
  128.  
  129. BigInteger() = default;
  130.  
  131. BigInteger(int a) {
  132. if(a < 0) {
  133. negative = 1;
  134. }
  135. a = abs(a);
  136. base.clear();
  137. while(a != 0) {
  138. base.push_back(a % 10);
  139. a /= 10;
  140. }
  141. }
  142.  
  143. BigInteger& operator=(int a) {
  144. if(a < 0) {
  145. negative = 1;
  146. }
  147. a = abs(a);
  148. base.clear();
  149. while(a != 0) {
  150. base.push_back(a % 10);
  151. a /= 10;
  152. }
  153. }
  154.  
  155. BigInteger& operator+= (const BigInteger& int2) {
  156. BigInteger nw = *this + int2;
  157. base = nw.base;
  158. negative = nw.negative;
  159. return *this;
  160. }
  161.  
  162. BigInteger& operator-= (const BigInteger& int2) {
  163. BigInteger nw = *this - int2;
  164. base = nw.base;
  165. negative = nw.negative;
  166. return *this;
  167. }
  168.  
  169. BigInteger& operator*= (const BigInteger& int2) {
  170. BigInteger nw = *this * int2;
  171. base = nw.base;
  172. negative = nw.negative;
  173. return *this;
  174. }
  175.  
  176. BigInteger& operator/= (const BigInteger& int2) {
  177. BigInteger nw = *this / int2;
  178. base = nw.base;
  179. negative = nw.negative;
  180. return *this;
  181. }
  182.  
  183. BigInteger& operator%= (const BigInteger& int2) {
  184. BigInteger nw = *this % int2;
  185. base = nw.base;
  186. negative = nw.negative;
  187. return *this;
  188. }
  189.  
  190. BigInteger operator- () {
  191. negative = !negative;
  192. return *this;
  193. }
  194.  
  195. bool isLess(const BigInteger& int2) {
  196. if(base.size() < int2.base.size()) {
  197. return true;
  198. }
  199. if(base.size() > int2.base.size()) {
  200. return false;
  201. }
  202. for(std::size_t i = base.size() - 1; i >= 0; i--) {
  203. if(base[i] < int2.base[i]) {
  204. return true;
  205. }
  206. if(base[i] > int2.base[i]) {
  207. return false;
  208. }
  209. if(i == 0) {
  210. break;
  211. }
  212. }
  213. return false;
  214. }
  215.  
  216. bool operator< (const BigInteger& int2) {
  217. BigInteger int2Copy = int2;
  218. if(*this == BigInteger(0)) {
  219. negative = false;
  220. }
  221. if(int2 == BigInteger(0)) {
  222. int2Copy.negative = false;
  223. }
  224. if(negative != int2Copy.negative) {
  225. return ((negative) ? true : false);
  226. }
  227. else {
  228. return (isLess(int2Copy) != negative);
  229. }
  230. }
  231.  
  232. bool operator> (const BigInteger& int2) {
  233. return !(*this < int2) && *this != int2;
  234. }
  235.  
  236. bool operator<= (const BigInteger& int2) {
  237. return !(*this > int2);
  238. }
  239.  
  240. bool operator>= (const BigInteger& int2) {
  241. return !(*this < int2);
  242. }
  243.  
  244. BigInteger& operator++() {
  245. *this = *this + BigInteger(1);
  246. if(*this >= BigInteger(0)) {
  247. negative = false;
  248. }
  249. return *this;
  250. }
  251.  
  252. BigInteger operator++(int) {
  253. BigInteger current = *this;
  254. ++*this;
  255. if(*this >= BigInteger(0)) {
  256. negative = false;
  257. }
  258. return current;
  259. }
  260.  
  261. operator bool() const {
  262. return !(BigInteger(*this) == BigInteger(0));
  263. }
  264.  
  265. std::string toString() {
  266. std::string ans = "";
  267. for(int i : base) {
  268. ans += (i + '0');
  269. }
  270. reverse(ans.begin(), ans.end());
  271. return ans;
  272. }
  273.  
  274. std::vector<int> getBase() const {
  275. return base;
  276. }
  277.  
  278. bool getNegative() const {
  279. return negative;
  280. }
  281.  
  282. void setNegative(bool value) {
  283. negative = value;
  284. }
  285.  
  286. void setBase(std::vector<int> value) {
  287. base = value;
  288. }
  289.  
  290. void pushBack(int value) {
  291. base.push_back(value);
  292. }
  293.  
  294. void popBack() {
  295. base.pop_back();
  296. }
  297.  
  298. void updateNext(int value) {
  299. base[value + 1] += base[value] / 10;
  300. }
  301.  
  302. // Could be overflow
  303. int toInt() {
  304. int ans = 0;
  305. int pw = 1;
  306. for(std::size_t i = 0; i < base.size(); i++) {
  307. ans += base[i] * pw;
  308. pw *= 10;
  309. }
  310. return ans;
  311. }
  312.  
  313. friend std::ostringstream& operator<<(std::ostringstream& os, const BigInteger& integer);
  314. friend std::ostream& operator<<(std::ostream& os, const BigInteger& integer);
  315. friend std::istringstream& operator>>(std::istringstream& is, BigInteger& integer);
  316. friend bool operator== (const BigInteger& int1, const BigInteger& int2);
  317. friend bool operator!= (const BigInteger& int1, const BigInteger& int2);
  318. friend BigInteger operator+ (const BigInteger& int1, const BigInteger& int2);
  319. friend BigInteger operator- (const BigInteger& int1, const BigInteger& int2);
  320. friend BigInteger operator* (const BigInteger& int1, const BigInteger& int2);
  321. friend BigInteger operator/ (const BigInteger& int1, const BigInteger& int2);
  322. friend BigInteger operator% (const BigInteger& int1, const BigInteger& int2);
  323.  
  324. };
  325.  
  326. bool checkDifferentSignsZeros(const std::vector<int>& base1, const std::vector<int>& base2) {
  327. return (base1.size() == 1 && base1[0] == 0 && base2[0] == 0);
  328. }
  329.  
  330. bool operator== (const BigInteger& int1, const BigInteger& int2) {
  331. std::vector<int> base1 = int1.getBase();
  332. std::vector<int> base2 = int2.getBase();
  333. if(base1.size() != base2.size()) {
  334. return false;
  335. }
  336. if(checkDifferentSignsZeros(base1, base2)) {
  337. return true;
  338. }
  339. if(int1.getNegative() != int2.getNegative()) {
  340. return false;
  341. }
  342. for(std::size_t i = 0; i < base1.size(); i++) {
  343. if(base1[i] != base2[i]) {
  344. return false;
  345. }
  346. }
  347. return true;
  348. }
  349.  
  350. bool operator!= (const BigInteger& int1, const BigInteger& int2) {
  351. return !(int1 == int2);
  352. }
  353.  
  354. std::ostringstream& operator<<(std::ostringstream& os, const BigInteger& integer) {
  355. os << ((integer.getNegative()) ? "-" : "");
  356. std::vector<int> base = integer.getBase();
  357. for(std::size_t i = base.size() - 1; i >= 0; i--) {
  358. os << base[i];
  359. if(i == 0) {
  360. break;
  361. }
  362. }
  363. return os;
  364. }
  365.  
  366. std::ostream& operator<<(std::ostream& os, const BigInteger& integer) {
  367. os << ((integer.getNegative()) ? "-" : "");
  368. std::vector<int> base = integer.getBase();
  369. for(std::size_t i = base.size() - 1; i >= 0; i--) {
  370. os << base[i];
  371. if(i == 0) {
  372. break;
  373. }
  374. }
  375. return os;
  376. }
  377.  
  378. std::istringstream& operator>>(std::istringstream& is, BigInteger& integer) {
  379. integer.base.clear();
  380. std::string s;
  381. is >> s;
  382. for(int i = s.size() - 1; i >= 0; i--) {
  383. integer.base.push_back(s[i] - '0');
  384. }
  385. return is;
  386. }
  387.  
  388. BigInteger operator+ (const BigInteger& int1, const BigInteger& int2) {
  389. int next = 0;
  390. BigInteger answer;
  391. BigInteger a = int1;
  392. BigInteger b = int2;
  393. std::vector<int> aBase = a.getBase();
  394. std::vector<int> bBase = b.getBase();
  395. if(a.getNegative() == false && b.getNegative() == false) {
  396. answer.setNegative(false);
  397. }
  398. else if(a.getNegative() && !b.getNegative()) {
  399. a.setNegative(false);
  400. answer = b - a;
  401. return answer;
  402. }
  403. else if(!a.getNegative() && b.getNegative()) {
  404. b.setNegative(false);
  405. answer = a - b;
  406. return answer;
  407. }
  408. else {
  409. answer.setNegative(true);
  410. }
  411. if(a < b) {
  412. std::swap(a, b);
  413. }
  414.  
  415. for(std::size_t i = 0; i < aBase.size(); i++) {
  416. if(i < bBase.size()) {
  417. int num = aBase[i] + bBase[i] + next;
  418. answer.pushBack(num % 10);
  419. next = (num / 10) % 10;
  420. }
  421. else {
  422. answer.pushBack(aBase[i] + next);
  423. next = 0;
  424. }
  425. }
  426. if(next != 0) {
  427. answer.pushBack(next);
  428. }
  429. return answer;
  430. }
  431.  
  432.  
  433.  
  434. BigInteger operator- (const BigInteger& int1, const BigInteger& int2) {
  435. BigInteger answer;
  436. BigInteger a = int1;
  437. BigInteger b = int2;
  438. std::vector<int> aBase = a.getBase();
  439. std::vector<int> bBase = b.getBase();
  440. if(a.getNegative() == false && b.getNegative() == false) {
  441. answer.setNegative(false);
  442. }
  443. else if(a.getNegative() && !b.getNegative()) {
  444. a.setNegative(false);
  445. answer = a + b;
  446. answer.setNegative(true);
  447. return answer;
  448. }
  449. else if(!a.getNegative() && b.getNegative()) {
  450. b.setNegative(false);
  451. answer = a + b;
  452. answer.setNegative(false);
  453. return answer;
  454. }
  455. else {
  456. std::swap(a, b);
  457. answer.setNegative(false);
  458. }
  459. int inverse = 0;
  460. if(a < b) {
  461. std::swap(a, b);
  462. inverse = 1;
  463. }
  464. int add = 0;
  465. for(std::size_t i = 0; i < aBase.size(); i++) {
  466. if(i < bBase.size()) {
  467. if(aBase[i] - add >= bBase[i]) {
  468. answer.pushBack(aBase[i] - add - bBase[i]);
  469. }
  470. else {
  471. answer.pushBack(aBase[i] - add - bBase[i] + 10);
  472. add = 1;
  473. }
  474. }
  475. else {
  476. if(aBase[i] >= add) {
  477. answer.pushBack(aBase[i] - add);
  478. add = 0;
  479. }
  480. else {
  481. answer.pushBack(10 - add);
  482. add = 1;
  483. }
  484. }
  485. }
  486. while(answer.getBase().size() && answer.getBase().back() == 0) {
  487. answer.popBack();
  488. }
  489. if(answer.getBase().size() == 0) {
  490. answer.pushBack(0);
  491. }
  492. answer.setNegative(!inverse);
  493. return answer;
  494. }
  495.  
  496. BigInteger operator* (const BigInteger& int1, const BigInteger& int2) {
  497. BigInteger a = int1;
  498. BigInteger b = int2;
  499. BigInteger answer;
  500. Multiplicator multiplicator;
  501. std::vector<int> aBase = a.getBase();
  502. std::vector<int> bBase = b.getBase();
  503. std::vector<int> answerBase = answer.getBase();
  504. multiplicator.multiply(aBase, bBase, answerBase);
  505. answer.setBase(answerBase);
  506. if(a.getNegative() ^ b.getNegative()) {
  507. answer.setNegative(true);
  508. }
  509. else {
  510. answer.setNegative(false);
  511. }
  512. for(std::size_t i = 0; i < answer.getBase().size() - 1; i++) {
  513. if(i < answer.getBase().size() - 1) {
  514. answer.updateNext(i);
  515. answer.base[i] %= 10;
  516. }
  517. }
  518. while(answer.getBase().back() != 0) {
  519. int cnt = answer.getBase().back();
  520. answer.base[answer.base.size() - 1] %= 10;
  521. answer.pushBack(cnt / 10);
  522.  
  523. }
  524. while(answer.getBase().size() && answer.getBase().back() == 0) {
  525. answer.base.pop_back();
  526. }
  527. if(answer.getBase().size() == 0) {
  528. answer.pushBack(0);
  529. }
  530. return answer;
  531. }
  532.  
  533. BigInteger operator/ (const BigInteger& int1, const BigInteger& int2) {
  534. BigInteger a = int1;
  535. BigInteger b = int2;
  536. BigInteger answer;
  537. std::vector<int> aBase = a.getBase();
  538. std::vector<int> bBase = b.getBase();
  539. if(a.getNegative() ^ b.getNegative()) {
  540. answer.setNegative(true);
  541. }
  542. else {
  543. answer.setNegative(false);
  544. }
  545. a.setNegative(false);
  546. b.setNegative(false);
  547. int pos = aBase.size() - 1;
  548. BigInteger cur = 0;
  549. while(pos >= 0) {
  550. cur = cur * BigInteger(10) + BigInteger(aBase[pos]);
  551. pos--;
  552. if(cur >= b) {
  553. int num;
  554. for(int i = 0; i < 10; i++) {
  555. if(b * BigInteger(i) > cur) {
  556. num = i - 1;
  557. break;
  558. }
  559. }
  560. BigInteger bigNum = num;
  561. cur = cur - (b * bigNum);
  562. answer.pushBack(num);
  563. }
  564. else {
  565. answer.pushBack(0);
  566. }
  567. }
  568. reverse(answer.getBase().begin(), answer.getBase().end());
  569. while(answer.getBase().size() && answer.getBase().back() == 0) {
  570. answer.popBack();
  571. }
  572. if(answer.getBase().size() == 0) {
  573. answer.pushBack(0);
  574. }
  575. return answer;
  576. }
  577.  
  578. BigInteger operator% (const BigInteger& int1, const BigInteger& int2) {
  579. BigInteger a = int1;
  580. BigInteger b = int2;
  581. BigInteger answer = a;
  582. std::vector<int> aBase = a.getBase();
  583. std::vector<int> bBase = b.getBase();
  584. bool negative = a.getNegative();
  585. b.setNegative(false);
  586. int pos = aBase.size() - 1;
  587. BigInteger cur = 0;
  588. while(pos >= 0) {
  589. cur = cur * BigInteger(10) + BigInteger(aBase[pos]);
  590. pos--;
  591. if(cur >= b) {
  592. int num;
  593. for(int i = 0; i < 10; i++) {
  594. if(b * BigInteger(i) > cur) {
  595. num = i - 1;
  596. break;
  597. }
  598. }
  599. BigInteger bigNum = num;
  600. cur = cur - (b * bigNum);
  601. answer = cur;
  602. }
  603. }
  604. answer.setNegative(negative);
  605. return answer;
  606. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement