fork download
  1. #include<deque>
  2. #include<string>
  3. #include<vector>
  4. #include<complex>
  5. #include<assert.h>
  6. #include<algorithm>
  7. #define PI 3.14159265358979323846
  8. void fft(std::vector<std::complex<double>>&a, bool invert)
  9. {
  10. for (int i = 1, j = 0; i < a.size(); i++)
  11. {
  12. int bit = int(a.size()) >> 1;
  13. for (; j & bit; bit >>= 1)
  14. {
  15. j ^= bit;
  16. }
  17. j ^= bit;
  18. if (i < j)
  19. {
  20. swap(a[i], a[j]);
  21. }
  22. }
  23. for (int len = 2; len <= a.size(); len <<= 1)
  24. {
  25. double ang = 2 * PI / len * (invert ? -1 : 1);
  26. std::complex<double>wlen(cos(ang), sin(ang));
  27. for (int i = 0; i < a.size(); i += len)
  28. {
  29. std::complex<double>w(1);
  30. for (int j = 0; j < (len >> 1); j++)
  31. {
  32. std::complex<double>u = a[i + j], v = a[i + j + (len >> 1)] * w;
  33. a[i + j] = u + v;
  34. a[i + j + (len >> 1)] = u - v;
  35. w *= wlen;
  36. }
  37. }
  38. }
  39. if (invert)
  40. {
  41. for (int i = 0; i < a.size(); i++)
  42. {
  43. a[i] /= a.size();
  44. }
  45. }
  46. }
  47. struct BigInt
  48. {
  49. bool is_negative = false;
  50. std::deque<int>Digits = { 0 };
  51. BigInt() { }
  52. template<typename T>
  53. BigInt(T number)
  54. {
  55. (*this) = number;
  56. }
  57. inline operator std::string() const
  58. {
  59. std::stringstream string_stream;
  60. string_stream << *this;
  61. return string_stream.str();
  62. }
  63. inline operator bool() const
  64. {
  65. return *this != 0;
  66. }
  67. inline operator int32_t() const
  68. {
  69. return std::stoi(*this);
  70. }
  71. inline operator int64_t() const
  72. {
  73. return std::stoll(*this);
  74. }
  75. inline operator unsigned() const
  76. {
  77. return std::stoul(*this);
  78. }
  79. inline operator double() const
  80. {
  81. return std::stod(*this);
  82. }
  83. inline operator float() const
  84. {
  85. return std::stof(*this);
  86. }
  87. inline operator char() const
  88. {
  89. return int(*this);
  90. }
  91. inline void shrink_to_fit()
  92. {
  93. int new_size = Digits.size();
  94. while (new_size > 1 && Digits[new_size - 1] == 0)
  95. {
  96. new_size--;
  97. }
  98. Digits.resize(new_size);
  99. }
  100. inline friend std::istream& operator >> (std::istream& input_stream, BigInt& object)
  101. {
  102. std::string number;
  103. input_stream >> number;
  104. object = number;
  105. return input_stream;
  106. }
  107. friend std::ostream& operator << (std::ostream& output_stream, BigInt object)
  108. {
  109. object.shrink_to_fit();
  110. if (object.is_negative && (object.Digits.size() != 1 || object.Digits[0] != 0))
  111. {
  112. output_stream << '-';
  113. }
  114. bool leading_zeros = true;
  115. for (int i = object.Digits.size() - 1; i >= 0; i--)
  116. {
  117. leading_zeros &= !object.Digits[i];
  118. if (object.Digits[i] || !leading_zeros)
  119. {
  120. output_stream << object.Digits[i];
  121. }
  122. }
  123. if (leading_zeros)
  124. {
  125. output_stream << '0';
  126. }
  127. return output_stream;
  128. }
  129. BigInt& operator = (std::string number)
  130. {
  131. if (number[0] == '-')
  132. {
  133. is_negative = true;
  134. }
  135. else
  136. {
  137. is_negative = false;
  138. }
  139. Digits.resize(number.size());
  140. int number_size = number.size();
  141. while (number.size() > is_negative)
  142. {
  143. if (number.back() != '.')
  144. {
  145. Digits[number_size - number.size()] = number.back() - '0';
  146. }
  147. else
  148. {
  149. number.pop_back();
  150. *this = number;
  151. return *this;
  152. }
  153. number.pop_back();
  154. }
  155. if (number.size())
  156. {
  157. Digits.pop_back();
  158. }
  159. return *this;
  160. }
  161. template<typename T>
  162. inline BigInt& operator = (T number)
  163. {
  164. std::stringstream string_stream;
  165. string_stream << std::fixed << number;
  166. *this = string_stream.str();
  167. return *this;
  168. }
  169. friend bool operator > (BigInt first_object, BigInt second_object)
  170. {
  171. if (first_object.is_negative)
  172. {
  173. if (second_object.is_negative)
  174. {
  175. first_object.is_negative = false;
  176. second_object.is_negative = false;
  177. return first_object < second_object;
  178. }
  179. else
  180. {
  181. return false;
  182. }
  183. }
  184. else if (second_object.is_negative)
  185. {
  186. return true;
  187. }
  188. if (first_object.Digits.size() < second_object.Digits.size())
  189. {
  190. first_object.Digits.resize(second_object.Digits.size());
  191. }
  192. else if (first_object.Digits.size() > second_object.Digits.size())
  193. {
  194. second_object.Digits.resize(first_object.Digits.size());
  195. }
  196. for (int i = first_object.Digits.size() - 1; i >= 0; i--)
  197. {
  198. if (first_object.Digits[i] < second_object.Digits[i])
  199. {
  200. return false;
  201. }
  202. else if (first_object.Digits[i] > second_object.Digits[i])
  203. {
  204. return true;
  205. }
  206. }
  207. return false;
  208. }
  209. friend bool operator < (BigInt first_object, BigInt second_object)
  210. {
  211. if (first_object.is_negative)
  212. {
  213. if (second_object.is_negative)
  214. {
  215. first_object.is_negative = false;
  216. second_object.is_negative = false;
  217. return first_object > second_object;
  218. }
  219. else
  220. {
  221. return true;
  222. }
  223. }
  224. else if (second_object.is_negative)
  225. {
  226. return false;
  227. }
  228. if (first_object.Digits.size() < second_object.Digits.size())
  229. {
  230. first_object.Digits.resize(second_object.Digits.size());
  231. }
  232. else if (first_object.Digits.size() > second_object.Digits.size())
  233. {
  234. second_object.Digits.resize(first_object.Digits.size());
  235. }
  236. for (int i = first_object.Digits.size() - 1; i >= 0; i--)
  237. {
  238. if (first_object.Digits[i] < second_object.Digits[i])
  239. {
  240. return true;
  241. }
  242. else if (first_object.Digits[i] > second_object.Digits[i])
  243. {
  244. return false;
  245. }
  246. }
  247. return false;
  248. }
  249. friend bool operator == (BigInt first_object, BigInt second_object)
  250. {
  251. if (first_object.Digits.size() < second_object.Digits.size())
  252. {
  253. first_object.Digits.resize(second_object.Digits.size());
  254. }
  255. else if (first_object.Digits.size() > second_object.Digits.size())
  256. {
  257. second_object.Digits.resize(first_object.Digits.size());
  258. }
  259. if (first_object.Digits == second_object.Digits)
  260. {
  261. first_object.shrink_to_fit();
  262. second_object.shrink_to_fit();
  263. return (!(first_object.is_negative ^ second_object.is_negative) || (first_object.Digits.size() == 1 && first_object.Digits[0] == 0));
  264. }
  265. else
  266. {
  267. return false;
  268. }
  269. }
  270. inline friend bool operator >= (BigInt first_object, BigInt second_object)
  271. {
  272. return first_object > second_object || first_object == second_object;
  273. }
  274. inline friend bool operator <= (BigInt first_object, BigInt second_object)
  275. {
  276. return first_object < second_object || first_object == second_object;
  277. }
  278. inline friend bool operator != (BigInt first_object, BigInt second_object)
  279. {
  280. return !(first_object == second_object);
  281. }
  282. template<typename T>
  283. inline friend bool operator > (BigInt first_object, T number)
  284. {
  285. BigInt second_object;
  286. second_object = number;
  287. return first_object > second_object;
  288. }
  289. template<typename T>
  290. inline friend bool operator < (BigInt first_object, T number)
  291. {
  292. BigInt second_object;
  293. second_object = number;
  294. return first_object < second_object;
  295. }
  296. template<typename T>
  297. inline friend bool operator == (BigInt first_object, T number)
  298. {
  299. BigInt second_object;
  300. second_object = number;
  301. return first_object == second_object;
  302. }
  303. template<typename T>
  304. inline friend bool operator >= (BigInt first_object, T number)
  305. {
  306. BigInt second_object;
  307. second_object = number;
  308. return first_object >= second_object;
  309. }
  310. template<typename T>
  311. inline friend bool operator <= (BigInt first_object, T number)
  312. {
  313. BigInt second_object;
  314. second_object = number;
  315. return first_object <= second_object;
  316. }
  317. template<typename T>
  318. inline friend bool operator != (BigInt first_object, T number)
  319. {
  320. BigInt second_object;
  321. second_object = number;
  322. return first_object != second_object;
  323. }
  324. template<typename T>
  325. inline friend bool operator > (T number, BigInt second_object)
  326. {
  327. BigInt first_object;
  328. first_object = number;
  329. return first_object > second_object;
  330. }
  331. template<typename T>
  332. inline friend bool operator < (T number, BigInt second_object)
  333. {
  334. BigInt first_object;
  335. first_object = number;
  336. return first_object < second_object;
  337. }
  338. template<typename T>
  339. inline friend bool operator == (T number, BigInt second_object)
  340. {
  341. BigInt first_object;
  342. first_object = number;
  343. return first_object == second_object;
  344. }
  345. template<typename T>
  346. inline friend bool operator >= (T number, BigInt second_object)
  347. {
  348. BigInt first_object;
  349. first_object = number;
  350. return first_object >= second_object;
  351. }
  352. template<typename T>
  353. inline friend bool operator <= (T number, BigInt second_object)
  354. {
  355. BigInt first_object;
  356. first_object = number;
  357. return first_object <= second_object;
  358. }
  359. template<typename T>
  360. inline friend bool operator != (T number, BigInt second_object)
  361. {
  362. BigInt first_object;
  363. first_object = number;
  364. return first_object != second_object;
  365. }
  366. friend BigInt operator + (BigInt first_object, BigInt second_object)
  367. {
  368. if (second_object.is_negative)
  369. {
  370. second_object.is_negative = false;
  371. return first_object - second_object;
  372. }
  373. if (first_object.is_negative)
  374. {
  375. first_object.is_negative = false;
  376. return second_object - first_object;
  377. }
  378. int carry = 0;
  379. if (first_object.Digits.size() < second_object.Digits.size())
  380. {
  381. first_object.Digits.resize(second_object.Digits.size());
  382. }
  383. if (first_object.Digits.size() > second_object.Digits.size())
  384. {
  385. second_object.Digits.resize(first_object.Digits.size());
  386. }
  387. for (int i = 0; i < first_object.Digits.size() - 1; i++)
  388. {
  389. first_object.Digits[i] += carry + second_object.Digits[i];
  390. carry = first_object.Digits[i] / 10;
  391. first_object.Digits[i] %= 10;
  392. }
  393. first_object.Digits[first_object.Digits.size() - 1] += carry;
  394. first_object.shrink_to_fit();
  395. return first_object;
  396. }
  397. friend BigInt operator - (BigInt first_object, BigInt second_object)
  398. {
  399. if (second_object.is_negative)
  400. {
  401. second_object.is_negative = false;
  402. return first_object + second_object;
  403. }
  404. if (first_object < second_object)
  405. {
  406. first_object = second_object - first_object;
  407. first_object.is_negative = !first_object.is_negative;
  408. return first_object;
  409. }
  410. bool borrow = false;
  411. second_object.Digits.resize(first_object.Digits.size());
  412. for (int i = 0; i < first_object.Digits.size(); i++)
  413. {
  414. first_object.Digits[i] -= second_object.Digits[i] + borrow;
  415. if (first_object.Digits[i] < 0)
  416. {
  417. first_object.Digits[i] += 10;
  418. borrow = true;
  419. }
  420. else
  421. {
  422. borrow = false;
  423. }
  424. }
  425. first_object.shrink_to_fit();
  426. return first_object;
  427. }
  428. friend BigInt operator * (BigInt first_object, BigInt second_object)
  429. {
  430. if (first_object.Digits.size() * second_object.Digits.size() <= (first_object.Digits.size() + second_object.Digits.size()) * log2(first_object.Digits.size() + second_object.Digits.size()))
  431. {
  432. BigInt result;
  433. result.Digits.resize(first_object.Digits.size() + second_object.Digits.size());
  434. for (int i = 0; i < second_object.Digits.size(); i++)
  435. {
  436. int carry = 0;
  437. for (int j = 0; j < first_object.Digits.size(); j++)
  438. {
  439. result.Digits[i + j] += first_object.Digits[j] * second_object.Digits[i] + carry;
  440. carry = result.Digits[i + j] / 10;
  441. result.Digits[i + j] %= 10;
  442. }
  443. result.Digits[i + first_object.Digits.size()] = carry;
  444. }
  445. result.shrink_to_fit();
  446. result.is_negative = first_object.is_negative ^ second_object.is_negative;
  447. return result;
  448. }
  449. first_object.is_negative ^= second_object.is_negative;
  450. int new_size = 1;
  451. while (new_size < first_object.Digits.size() + second_object.Digits.size())
  452. {
  453. new_size <<= 1;
  454. }
  455. first_object.Digits.resize(new_size);
  456. second_object.Digits.resize(new_size);
  457. std::vector<std::complex<double>>fa(first_object.Digits.begin(), first_object.Digits.end()), fb(second_object.Digits.begin(), second_object.Digits.end());
  458. fft(fa, false);
  459. fft(fb, false);
  460. for (int i = 0; i < new_size; i++)
  461. {
  462. fa[i] *= fb[i];
  463. }
  464. fft(fa, true);
  465. for (int i = 0; i < new_size; i++)
  466. {
  467. first_object.Digits[i] = round(fa[i].real());
  468. }
  469. int carry = 0;
  470. for (int i = 0; i < new_size; i++)
  471. {
  472. first_object.Digits[i] += carry;
  473. carry = first_object.Digits[i] / 10;
  474. first_object.Digits[i] %= 10;
  475. }
  476. first_object.shrink_to_fit();
  477. return first_object;
  478. }
  479. friend BigInt operator / (BigInt first_object, BigInt second_object)
  480. {
  481. assert(second_object != 0);
  482. BigInt result, carry;
  483. result.is_negative = first_object.is_negative ^ second_object.is_negative;
  484. first_object.is_negative = false;
  485. second_object.is_negative = false;
  486. carry.Digits.resize(first_object.Digits.size());
  487. result.Digits.resize(first_object.Digits.size());
  488. for (int i = first_object.Digits.size() - 1; i >= 0; i--)
  489. {
  490. carry.Digits.push_front(first_object.Digits[i]);
  491. int answer = 9;
  492. BigInt temp = second_object * 9;
  493. while (answer >= 0)
  494. {
  495. if (temp <= carry)
  496. {
  497. break;
  498. }
  499. temp -= second_object;
  500. answer--;
  501. }
  502. result.Digits[i] = answer;
  503. carry -= second_object * answer;
  504. }
  505. result.shrink_to_fit();
  506. return result;
  507. }
  508. friend BigInt operator % (BigInt first_object, BigInt second_object)
  509. {
  510. assert(second_object != 0);
  511. BigInt result, carry;
  512. bool negative_temp = first_object.is_negative;
  513. first_object.is_negative = false;
  514. second_object.is_negative = false;
  515. carry.Digits.resize(first_object.Digits.size());
  516. result.Digits.resize(first_object.Digits.size());
  517. for (int i = first_object.Digits.size() - 1; i >= 0; i--)
  518. {
  519. carry.Digits.push_front(first_object.Digits[i]);
  520. int answer = 9;
  521. BigInt temp = second_object * 9;
  522. while (answer >= 0)
  523. {
  524. if (temp <= carry)
  525. {
  526. break;
  527. }
  528. temp -= second_object;
  529. answer--;
  530. }
  531. result.Digits[i] = answer;
  532. carry -= second_object * answer;
  533. }
  534. carry.is_negative = negative_temp;
  535. carry.shrink_to_fit();
  536. return carry;
  537. }
  538. friend BigInt operator | (BigInt first_object, BigInt second_object)
  539. {
  540. if (first_object.is_negative)
  541. {
  542. return ~(~first_object & ~second_object);
  543. }
  544. bool flip = false;
  545. if (second_object.is_negative)
  546. {
  547. flip = true;
  548. second_object = ~second_object;
  549. }
  550. std::string first_number, second_number;
  551. while (first_object)
  552. {
  553. int64_t block = first_object % (1 << 30);
  554. first_object /= (1 << 30);
  555. for (int i = 0; i < 30; i++)
  556. {
  557. if (!block && !first_object)
  558. {
  559. break;
  560. }
  561. first_number.push_back((block % 2) + '0');
  562. block /= 2;
  563. }
  564. }
  565. while (second_object)
  566. {
  567. int64_t block = second_object % (1 << 30);
  568. second_object /= (1 << 30);
  569. for (int i = 0; i < 30; i++)
  570. {
  571. if (!block && !second_object)
  572. {
  573. break;
  574. }
  575. second_number.push_back((block % 2) + '0');
  576. block /= 2;
  577. }
  578. }
  579. first_number.push_back('0');
  580. second_number.push_back('0');
  581. while (first_number.size() < second_number.size())
  582. {
  583. first_number.push_back('0');
  584. }
  585. while (first_number.size() > second_number.size())
  586. {
  587. second_number.push_back('0');
  588. }
  589. if (flip)
  590. {
  591. for (int i = 0; i < second_number.size(); i++)
  592. {
  593. if (second_number[i] == '0')
  594. {
  595. second_number[i] = '1';
  596. }
  597. else
  598. {
  599. second_number[i] = '0';
  600. }
  601. }
  602. }
  603. for (int i = 0; i < first_number.size(); i++)
  604. {
  605. first_number[i] = ((first_number[i] - '0') || (second_number[i] - '0')) + '0';
  606. }
  607. if (first_number.back() - '0')
  608. {
  609. flip = true;
  610. for (int i = 0; i < first_number.size(); i++)
  611. {
  612. if (first_number[i] == '0')
  613. {
  614. first_number[i] = '1';
  615. }
  616. else
  617. {
  618. first_number[i] = '0';
  619. }
  620. }
  621. }
  622. else
  623. {
  624. flip = false;
  625. }
  626. BigInt answer, temp = 1;
  627. reverse(first_number.begin(), first_number.end());
  628. while (first_number.size())
  629. {
  630. if (first_number.back() - '0')
  631. {
  632. answer += temp;
  633. }
  634. temp += temp;
  635. first_number.pop_back();
  636. }
  637. if (flip)
  638. {
  639. return ~answer;
  640. }
  641. return answer;
  642. }
  643. friend BigInt operator & (BigInt first_object, BigInt second_object)
  644. {
  645. if (first_object.is_negative)
  646. {
  647. return ~(~first_object | ~second_object);
  648. }
  649. bool flip = false;
  650. if (second_object.is_negative)
  651. {
  652. flip = true;
  653. second_object = ~second_object;
  654. }
  655. std::string first_number, second_number;
  656. while (first_object)
  657. {
  658. int64_t block = first_object % (1 << 30);
  659. first_object /= (1 << 30);
  660. for (int i = 0; i < 30; i++)
  661. {
  662. if (!block && !first_object)
  663. {
  664. break;
  665. }
  666. first_number.push_back((block % 2) + '0');
  667. block /= 2;
  668. }
  669. }
  670. while (second_object)
  671. {
  672. int64_t block = second_object % (1 << 30);
  673. second_object /= (1 << 30);
  674. for (int i = 0; i < 30; i++)
  675. {
  676. if (!block && !second_object)
  677. {
  678. break;
  679. }
  680. second_number.push_back((block % 2) + '0');
  681. block /= 2;
  682. }
  683. }
  684. first_number.push_back('0');
  685. second_number.push_back('0');
  686. while (first_number.size() < second_number.size())
  687. {
  688. first_number.push_back('0');
  689. }
  690. while (first_number.size() > second_number.size())
  691. {
  692. second_number.push_back('0');
  693. }
  694. if (flip)
  695. {
  696. for (int i = 0; i < second_number.size(); i++)
  697. {
  698. if (second_number[i] == '0')
  699. {
  700. second_number[i] = '1';
  701. }
  702. else
  703. {
  704. second_number[i] = '0';
  705. }
  706. }
  707. }
  708. for (int i = 0; i < first_number.size(); i++)
  709. {
  710. first_number[i] = ((first_number[i] - '0') && (second_number[i] - '0')) + '0';
  711. }
  712. if (first_number.back() - '0')
  713. {
  714. flip = true;
  715. for (int i = 0; i < first_number.size(); i++)
  716. {
  717. if (first_number[i] == '0')
  718. {
  719. first_number[i] = '1';
  720. }
  721. else
  722. {
  723. first_number[i] = '0';
  724. }
  725. }
  726. }
  727. else
  728. {
  729. flip = false;
  730. }
  731. BigInt answer, temp = 1;
  732. reverse(first_number.begin(), first_number.end());
  733. while (first_number.size())
  734. {
  735. if (first_number.back() - '0')
  736. {
  737. answer += temp;
  738. }
  739. temp += temp;
  740. first_number.pop_back();
  741. }
  742. if (flip)
  743. {
  744. return ~answer;
  745. }
  746. return answer;
  747. }
  748. friend BigInt operator ^ (BigInt first_object, BigInt second_object)
  749. {
  750. if (first_object == 0)
  751. {
  752. return second_object;
  753. }
  754. if (second_object == 0)
  755. {
  756. return first_object;
  757. }
  758. if (first_object < 0 && second_object < 0)
  759. {
  760. return ~first_object ^ ~second_object;
  761. }
  762. if (first_object < 0)
  763. {
  764. return ~(~first_object ^ second_object);
  765. }
  766. if (second_object < 0)
  767. {
  768. return ~(first_object ^ ~second_object);
  769. }
  770. std::string first_number, second_number;
  771. while (first_object)
  772. {
  773. int64_t block = first_object % (1 << 30);
  774. first_object /= (1 << 30);
  775. for (int i = 0; i < 30; i++)
  776. {
  777. if (!block && !first_object)
  778. {
  779. break;
  780. }
  781. first_number.push_back((block % 2) + '0');
  782. block /= 2;
  783. }
  784. }
  785. while (second_object)
  786. {
  787. int64_t block = second_object % (1 << 30);
  788. second_object /= (1 << 30);
  789. for (int i = 0; i < 30; i++)
  790. {
  791. if (!block && !second_object)
  792. {
  793. break;
  794. }
  795. second_number.push_back((block % 2) + '0');
  796. block /= 2;
  797. }
  798. }
  799. while (first_number.size() < second_number.size())
  800. {
  801. first_number.push_back('0');
  802. }
  803. while (first_number.size() > second_number.size())
  804. {
  805. second_number.push_back('0');
  806. }
  807. for (int i = 0; i < first_number.size(); i++)
  808. {
  809. first_number[i] = ((first_number[i] - '0') ^ (second_number[i] - '0')) + '0';
  810. }
  811. reverse(first_number.begin(), first_number.end());
  812. BigInt answer, temp = 1;
  813. while (first_number.size())
  814. {
  815. if (first_number.back() - '0')
  816. {
  817. answer += temp;
  818. }
  819. temp += temp;
  820. first_number.pop_back();
  821. }
  822. return answer;
  823. }
  824. friend BigInt operator >> (BigInt object, int number)
  825. {
  826. if (number < 0)
  827. {
  828. return object << -number;
  829. }
  830. if (object.is_negative)
  831. {
  832. return ~(~object >> number);
  833. }
  834. std::string bits;
  835. while (object)
  836. {
  837. int64_t block = object % (1 << 30);
  838. object /= (1 << 30);
  839. for (int i = 0; i < 30; i++)
  840. {
  841. if (!block && !object)
  842. {
  843. break;
  844. }
  845. bits.push_back((block % 2) + '0');
  846. block /= 2;
  847. }
  848. }
  849. reverse(bits.begin(), bits.end());
  850. bits.resize((number > bits.size() ? 0 : bits.size() - number));
  851. BigInt answer, temp = 1;
  852. while (bits.size())
  853. {
  854. if (bits.back() - '0')
  855. {
  856. answer += temp;
  857. }
  858. temp += temp;
  859. bits.pop_back();
  860. }
  861. return answer;
  862. }
  863. friend BigInt operator << (BigInt object, int number)
  864. {
  865. if (number == 0)
  866. {
  867. return object;
  868. }
  869. else if (number < 0)
  870. {
  871. return object >> -number;
  872. }
  873. std::string bits;
  874. bool negative_temp = object.is_negative;
  875. object.is_negative = false;
  876. while (object)
  877. {
  878. int64_t block = object % (1 << 30);
  879. object /= (1 << 30);
  880. for (int i = 0; i < 30; i++)
  881. {
  882. if (!block && !object)
  883. {
  884. break;
  885. }
  886. bits.push_back((block % 2) + '0');
  887. block /= 2;
  888. }
  889. }
  890. reverse(bits.begin(), bits.end());
  891. while (number--)
  892. {
  893. bits.push_back('0');
  894. }
  895. BigInt answer, temp = 1;
  896. while (bits.size())
  897. {
  898. if (bits.back() - '0')
  899. {
  900. answer += temp;
  901. }
  902. temp += temp;
  903. bits.pop_back();
  904. }
  905. answer.is_negative = negative_temp;
  906. return answer;
  907. }
  908. template<typename T>
  909. inline friend BigInt operator + (BigInt first_object, T number)
  910. {
  911. BigInt second_object;
  912. second_object = number;
  913. return first_object + second_object;
  914. }
  915. template<typename T>
  916. inline friend BigInt operator - (BigInt first_object, T number)
  917. {
  918. BigInt second_object;
  919. second_object = number;
  920. return first_object - second_object;
  921. }
  922. template<typename T>
  923. inline friend BigInt operator * (BigInt first_object, T number)
  924. {
  925. BigInt second_object;
  926. second_object = number;
  927. return first_object * second_object;
  928. }
  929. template<typename T>
  930. inline friend BigInt operator / (BigInt first_object, T number)
  931. {
  932. BigInt second_object;
  933. second_object = number;
  934. return first_object / second_object;
  935. }
  936. template<typename T>
  937. inline friend BigInt operator % (BigInt first_object, T number)
  938. {
  939. BigInt second_object;
  940. second_object = number;
  941. return first_object % second_object;
  942. }
  943. template<typename T>
  944. inline friend BigInt operator | (BigInt first_object, T number)
  945. {
  946. BigInt second_object;
  947. second_object = number;
  948. return first_object | second_object;
  949. }
  950. template<typename T>
  951. inline friend BigInt operator & (BigInt first_object, T number)
  952. {
  953. BigInt second_object;
  954. second_object = number;
  955. return first_object & second_object;
  956. }
  957. template<typename T>
  958. inline friend BigInt operator ^ (BigInt first_object, T number)
  959. {
  960. BigInt second_object;
  961. second_object = number;
  962. return first_object ^ second_object;
  963. }
  964. template<typename T>
  965. inline friend BigInt operator + (T number, BigInt second_object)
  966. {
  967. BigInt first_object;
  968. first_object = number;
  969. return first_object + second_object;
  970. }
  971. template<typename T>
  972. inline friend BigInt operator - (T number, BigInt second_object)
  973. {
  974. BigInt first_object;
  975. first_object = number;
  976. return first_object - second_object;
  977. }
  978. template<typename T>
  979. inline friend BigInt operator * (T number, BigInt second_object)
  980. {
  981. BigInt first_object;
  982. first_object = number;
  983. return first_object * second_object;
  984. }
  985. template<typename T>
  986. inline friend BigInt operator / (T number, BigInt second_object)
  987. {
  988. BigInt first_object;
  989. first_object = number;
  990. return first_object / second_object;
  991. }
  992. template<typename T>
  993. inline friend BigInt operator % (T number, BigInt second_object)
  994. {
  995. BigInt first_object;
  996. first_object = number;
  997. return first_object % second_object;
  998. }
  999. template<typename T>
  1000. inline friend BigInt operator | (T number, BigInt second_object)
  1001. {
  1002. BigInt first_object;
  1003. first_object = number;
  1004. return first_object | second_object;
  1005. }
  1006. template<typename T>
  1007. inline friend BigInt operator & (T number, BigInt second_object)
  1008. {
  1009. BigInt first_object;
  1010. first_object = number;
  1011. return first_object & second_object;
  1012. }
  1013. template<typename T>
  1014. inline friend BigInt operator ^ (T number, BigInt second_object)
  1015. {
  1016. BigInt first_object;
  1017. first_object = number;
  1018. return first_object ^ second_object;
  1019. }
  1020. template<typename T>
  1021. inline BigInt& operator += (T number)
  1022. {
  1023. *this = *this + number;
  1024. return *this;
  1025. }
  1026. template<typename T>
  1027. inline BigInt& operator -= (T number)
  1028. {
  1029. *this = *this - number;
  1030. return *this;
  1031. }
  1032. template<typename T>
  1033. inline BigInt& operator *= (T number)
  1034. {
  1035. *this = *this * number;
  1036. return *this;
  1037. }
  1038. template<typename T>
  1039. inline BigInt& operator /= (T number)
  1040. {
  1041. *this = *this / number;
  1042. return *this;
  1043. }
  1044. template<typename T>
  1045. inline BigInt& operator %= (T number)
  1046. {
  1047. *this = *this % number;
  1048. return *this;
  1049. }
  1050. template<typename T>
  1051. inline BigInt& operator |= (T number)
  1052. {
  1053. *this = *this | number;
  1054. return *this;
  1055. }
  1056. template<typename T>
  1057. inline BigInt& operator &= (T number)
  1058. {
  1059. *this = *this & number;
  1060. return *this;
  1061. }
  1062. template<typename T>
  1063. inline BigInt& operator ^= (T number)
  1064. {
  1065. *this = *this ^ number;
  1066. return *this;
  1067. }
  1068. inline BigInt& operator >>= (int number)
  1069. {
  1070. *this = *this >> number;
  1071. return *this;
  1072. }
  1073. inline BigInt& operator <<= (int number)
  1074. {
  1075. *this = *this << number;
  1076. return *this;
  1077. }
  1078. inline BigInt& operator ++ ()
  1079. {
  1080. (*this) = (*this) + 1;
  1081. return (*this);
  1082. }
  1083. inline BigInt operator ++ (int32_t)
  1084. {
  1085. (*this) = (*this) + 1;
  1086. return (*this) - 1;
  1087. }
  1088. inline BigInt& operator -- ()
  1089. {
  1090. (*this) = (*this) - 1;
  1091. return (*this);
  1092. }
  1093. inline BigInt operator -- (int32_t)
  1094. {
  1095. (*this) = (*this) - 1;
  1096. return (*this) + 1;
  1097. }
  1098. inline friend BigInt operator - (BigInt object)
  1099. {
  1100. return 0 - object;
  1101. }
  1102. inline BigInt operator ~ ()
  1103. {
  1104. return 0 - (*this) - 1;
  1105. }
  1106. };
  1107. BigInt __gcd(BigInt first_number, BigInt second_number)
  1108. {
  1109. return second_number == 0 ? first_number : __gcd(second_number, first_number % second_number);
  1110. }
  1111. inline BigInt __lcm(BigInt first_number, BigInt second_number)
  1112. {
  1113. return first_number * second_number / __gcd(first_number, second_number);
  1114. }
  1115. BigInt phi(BigInt number)
  1116. {
  1117. BigInt answer = number;
  1118. for (BigInt i = 2; i * i <= number; i++)
  1119. {
  1120. if (number % i == 0)
  1121. {
  1122. while (number % i == 0)
  1123. {
  1124. number /= i;
  1125. }
  1126. answer -= answer / i;
  1127. }
  1128. }
  1129. if (number > 1)
  1130. {
  1131. answer -= answer / number;
  1132. }
  1133. return answer;
  1134. }
  1135. int phi(int number)
  1136. {
  1137. int answer = number;
  1138. for (int i = 2; i * i <= number; i += 1)
  1139. {
  1140. if (number % i == 0)
  1141. {
  1142. while (number % i == 0)
  1143. {
  1144. number /= i;
  1145. }
  1146. answer -= answer / i;
  1147. }
  1148. }
  1149. if (number > 1)
  1150. {
  1151. answer -= answer / number;
  1152. }
  1153. return answer;
  1154. }
  1155. inline BigInt abs(BigInt number)
  1156. {
  1157. number.is_negative = false;
  1158. return number;
  1159. }
  1160. class BigFloat
  1161. {
  1162. private :
  1163. BigInt Numerator, Denominator;
  1164. public :
  1165. BigFloat() { }
  1166. template<typename T>
  1167. BigFloat(T number)
  1168. {
  1169. (*this) = number;
  1170. }
  1171. inline operator bool() const
  1172. {
  1173. return *this != 0;
  1174. }
  1175. inline operator int() const
  1176. {
  1177. return Numerator / Denominator;
  1178. }
  1179. inline operator unsigned() const
  1180. {
  1181. return Numerator / Denominator;
  1182. }
  1183. inline operator double()
  1184. {
  1185. return stod((*this).str(15));
  1186. }
  1187. inline operator float()
  1188. {
  1189. return stof((*this).str(7));
  1190. }
  1191. inline operator char() const
  1192. {
  1193. return int(*this);
  1194. }
  1195. inline operator BigInt() const
  1196. {
  1197. return Numerator / Denominator;
  1198. }
  1199. inline BigInt numerator()
  1200. {
  1201. return Numerator;
  1202. }
  1203. inline BigInt denominator()
  1204. {
  1205. return Denominator;
  1206. }
  1207. inline void numerator(BigInt number)
  1208. {
  1209. Numerator = number;
  1210. (*this).shrink_to_fit();
  1211. }
  1212. inline void denominator(BigInt number)
  1213. {
  1214. Denominator = number;
  1215. (*this).shrink_to_fit();
  1216. }
  1217. template<typename T>
  1218. inline void numerator(T number)
  1219. {
  1220. Numerator = number;
  1221. (*this).shrink_to_fit();
  1222. }
  1223. template<typename T>
  1224. inline void denominator(T number)
  1225. {
  1226. Denominator = number;
  1227. (*this).shrink_to_fit();
  1228. }
  1229. inline void shrink_to_fit()
  1230. {
  1231. Numerator.is_negative ^= Denominator.is_negative;
  1232. Denominator.is_negative = false;
  1233. if (Denominator.Digits.size() >= 1000)
  1234. {
  1235. BigInt GCD = __gcd(Numerator, Denominator);
  1236. Numerator /= GCD;
  1237. Denominator /= GCD;
  1238. }
  1239. }
  1240. std::string str(int Digits = 0)
  1241. {
  1242. if (Denominator == 0)
  1243. {
  1244. return "inf";
  1245. }
  1246. std::string answer;
  1247. bool negative_temp = false;
  1248. BigInt numerator = Numerator, denominator = Denominator;
  1249. if (numerator.is_negative ^ denominator.is_negative)
  1250. {
  1251. negative_temp = true;
  1252. }
  1253. numerator.is_negative = false;
  1254. denominator.is_negative = false;
  1255. for (int i = 0; i < Digits; i++)
  1256. {
  1257. numerator.Digits.push_front(0);
  1258. }
  1259. numerator /= denominator;
  1260. for (int i = Digits; i < numerator.Digits.size(); i++)
  1261. {
  1262. answer.push_back(numerator.Digits[i] + '0');
  1263. }
  1264. if (Digits >= numerator.Digits.size())
  1265. {
  1266. answer.push_back('0');
  1267. }
  1268. if (negative_temp)
  1269. {
  1270. answer.push_back('-');
  1271. }
  1272. reverse(answer.begin(), answer.end());
  1273. if (Digits)
  1274. {
  1275. answer.push_back('.');
  1276. std::string temp;
  1277. for (int i = 0; i < Digits; i++)
  1278. {
  1279. temp.push_back(numerator.Digits[i] + '0');
  1280. }
  1281. reverse(temp.begin(), temp.end());
  1282. for (int i = temp.size(); i < Digits; i++)
  1283. {
  1284. answer.push_back('0');
  1285. }
  1286. answer += temp;
  1287. }
  1288. return answer;
  1289. }
  1290. inline friend std::istream& operator >> (std::istream& input_stream, BigFloat& object)
  1291. {
  1292. std::string number;
  1293. input_stream >> number;
  1294. object = number;
  1295. return input_stream;
  1296. }
  1297. friend std::ostream& operator << (std::ostream& output_stream, BigFloat object)
  1298. {
  1299. if (object.Denominator == 0)
  1300. {
  1301. if (object.Numerator == 0)
  1302. {
  1303. output_stream << "Undefined";
  1304. return output_stream;
  1305. }
  1306. else
  1307. {
  1308. output_stream << "inf";
  1309. return output_stream;
  1310. }
  1311. }
  1312. BigInt GCD = __gcd(object.Numerator, object.Denominator);
  1313. object.Numerator /= GCD;
  1314. object.Denominator /= GCD;
  1315. output_stream << std::fixed << object.Numerator << '/' << object.Denominator;
  1316. return output_stream;
  1317. }
  1318. BigFloat& operator = (std::string number)
  1319. {
  1320. if (number[0] == '-')
  1321. {
  1322. Numerator.is_negative = true;
  1323. }
  1324. int dot_place = 0;
  1325. Numerator.Digits.resize(number.size());
  1326. Numerator.Digits[number.size() - 1] = 0;
  1327. for (int i = number.size() - 1; i >= Numerator.is_negative; i--)
  1328. {
  1329. if (number[i] != '.')
  1330. {
  1331. Numerator.Digits[number.size() - i - (bool)dot_place - 1] = number[i] - '0';
  1332. }
  1333. else
  1334. {
  1335. dot_place = number.size() - i - 1;
  1336. }
  1337. }
  1338. if (dot_place)
  1339. {
  1340. Numerator.Digits.pop_back();
  1341. }
  1342. Denominator.Digits = std::deque<int>(dot_place + 1);
  1343. Denominator.Digits[dot_place] = 1;
  1344. (*this).shrink_to_fit();
  1345. return *this;
  1346. }
  1347. template<typename T>
  1348. inline BigFloat& operator = (T number)
  1349. {
  1350. std::stringstream string_stream;
  1351. string_stream << std::fixed << number;
  1352. *this = string_stream.str();
  1353. return *this;
  1354. }
  1355. inline friend bool operator > (BigFloat first_object, BigFloat second_object)
  1356. {
  1357. return first_object.Numerator * second_object.Denominator > second_object.Numerator * first_object.Denominator;
  1358. }
  1359. inline friend bool operator < (BigFloat first_object, BigFloat second_object)
  1360. {
  1361. return first_object.Numerator * second_object.Denominator < second_object.Numerator * first_object.Denominator;
  1362. }
  1363. inline friend bool operator == (BigFloat first_object, BigFloat second_object)
  1364. {
  1365. return first_object.Numerator * second_object.Denominator == second_object.Numerator * first_object.Denominator;
  1366. }
  1367. inline friend bool operator >= (BigFloat first_object, BigFloat second_object)
  1368. {
  1369. return first_object.Numerator * second_object.Denominator >= second_object.Numerator * first_object.Denominator;
  1370. }
  1371. inline friend bool operator <= (BigFloat first_object, BigFloat second_object)
  1372. {
  1373. return first_object.Numerator * second_object.Denominator <= second_object.Numerator * first_object.Denominator;
  1374. }
  1375. inline friend bool operator != (BigFloat first_object, BigFloat second_object)
  1376. {
  1377. return first_object.Numerator * second_object.Denominator != second_object.Numerator * first_object.Denominator;
  1378. }
  1379. template<typename T>
  1380. inline friend bool operator > (BigFloat first_object, T number)
  1381. {
  1382. BigFloat second_object;
  1383. second_object = number;
  1384. return first_object > second_object;
  1385. }
  1386. template<typename T>
  1387. inline friend bool operator < (BigFloat first_object, T number)
  1388. {
  1389. BigFloat second_object;
  1390. second_object = number;
  1391. return first_object < second_object;
  1392. }
  1393. template<typename T>
  1394. inline friend bool operator == (BigFloat first_object, T number)
  1395. {
  1396. BigFloat second_object;
  1397. second_object = number;
  1398. return first_object == second_object;
  1399. }
  1400. template<typename T>
  1401. inline friend bool operator >= (BigFloat first_object, T number)
  1402. {
  1403. BigFloat second_object;
  1404. second_object = number;
  1405. return first_object >= second_object;
  1406. }
  1407. template<typename T>
  1408. inline friend bool operator <= (BigFloat first_object, T number)
  1409. {
  1410. BigFloat second_object;
  1411. second_object = number;
  1412. return first_object <= second_object;
  1413. }
  1414. template<typename T>
  1415. inline friend bool operator != (BigFloat first_object, T number)
  1416. {
  1417. BigFloat second_object;
  1418. second_object = number;
  1419. return first_object != second_object;
  1420. }
  1421. template<typename T>
  1422. inline friend bool operator > (T number, BigFloat second_object)
  1423. {
  1424. BigFloat first_object;
  1425. first_object = number;
  1426. return first_object > second_object;
  1427. }
  1428. template<typename T>
  1429. inline friend bool operator < (T number, BigFloat second_object)
  1430. {
  1431. BigFloat first_object;
  1432. first_object = number;
  1433. return first_object < second_object;
  1434. }
  1435. template<typename T>
  1436. inline friend bool operator == (T number, BigFloat second_object)
  1437. {
  1438. BigFloat first_object;
  1439. first_object = number;
  1440. return first_object == second_object;
  1441. }
  1442. template<typename T>
  1443. inline friend bool operator >= (T number, BigFloat second_object)
  1444. {
  1445. BigFloat first_object;
  1446. first_object = number;
  1447. return first_object >= second_object;
  1448. }
  1449. template<typename T>
  1450. inline friend bool operator <= (T number, BigFloat second_object)
  1451. {
  1452. BigFloat first_object;
  1453. first_object = number;
  1454. return first_object <= second_object;
  1455. }
  1456. template<typename T>
  1457. inline friend bool operator != (T number, BigFloat second_object)
  1458. {
  1459. BigFloat first_object;
  1460. first_object = number;
  1461. return first_object != second_object;
  1462. }
  1463. inline friend bool operator > (BigFloat first_object, BigInt number)
  1464. {
  1465. BigFloat second_object;
  1466. second_object = number;
  1467. return first_object > second_object;
  1468. }
  1469. inline friend bool operator < (BigFloat first_object, BigInt number)
  1470. {
  1471. BigFloat second_object;
  1472. second_object = number;
  1473. return first_object < second_object;
  1474. }
  1475. inline friend bool operator == (BigFloat first_object, BigInt number)
  1476. {
  1477. BigFloat second_object;
  1478. second_object = number;
  1479. return first_object == second_object;
  1480. }
  1481. inline friend bool operator >= (BigFloat first_object, BigInt number)
  1482. {
  1483. BigFloat second_object;
  1484. second_object = number;
  1485. return first_object >= second_object;
  1486. }
  1487. inline friend bool operator <= (BigFloat first_object, BigInt number)
  1488. {
  1489. BigFloat second_object;
  1490. second_object = number;
  1491. return first_object <= second_object;
  1492. }
  1493. inline friend bool operator != (BigFloat first_object, BigInt number)
  1494. {
  1495. BigFloat second_object;
  1496. second_object = number;
  1497. return first_object != second_object;
  1498. }
  1499. inline friend bool operator > (BigInt number, BigFloat second_object)
  1500. {
  1501. BigFloat first_object;
  1502. first_object = number;
  1503. return first_object > second_object;
  1504. }
  1505. inline friend bool operator < (BigInt number, BigFloat second_object)
  1506. {
  1507. BigFloat first_object;
  1508. first_object = number;
  1509. return first_object < second_object;
  1510. }
  1511. inline friend bool operator == (BigInt number, BigFloat second_object)
  1512. {
  1513. BigFloat first_object;
  1514. first_object = number;
  1515. return first_object == second_object;
  1516. }
  1517. inline friend bool operator >= (BigInt number, BigFloat second_object)
  1518. {
  1519. BigFloat first_object;
  1520. first_object = number;
  1521. return first_object >= second_object;
  1522. }
  1523. inline friend bool operator <= (BigInt number, BigFloat second_object)
  1524. {
  1525. BigFloat first_object;
  1526. first_object = number;
  1527. return first_object <= second_object;
  1528. }
  1529. inline friend bool operator != (BigInt number, BigFloat second_object)
  1530. {
  1531. BigFloat first_object;
  1532. first_object = number;
  1533. return first_object != second_object;
  1534. }
  1535. inline friend BigFloat operator - (BigFloat object)
  1536. {
  1537. return 0 - object;
  1538. }
  1539. inline friend BigFloat operator + (BigFloat first_object, BigFloat second_object)
  1540. {
  1541. first_object.Numerator = first_object.Numerator * second_object.Denominator + second_object.Numerator * first_object.Denominator;
  1542. first_object.Denominator *= second_object.Denominator;
  1543. first_object.shrink_to_fit();
  1544. return first_object;
  1545. }
  1546. inline friend BigFloat operator - (BigFloat first_object, BigFloat second_object)
  1547. {
  1548. first_object.Numerator = first_object.Numerator * second_object.Denominator - second_object.Numerator * first_object.Denominator;
  1549. first_object.Denominator *= second_object.Denominator;
  1550. first_object.shrink_to_fit();
  1551. return first_object;
  1552. }
  1553. inline friend BigFloat operator * (BigFloat first_object, BigFloat second_object)
  1554. {
  1555. first_object.Numerator *= second_object.Numerator;
  1556. first_object.Denominator *= second_object.Denominator;
  1557. first_object.shrink_to_fit();
  1558. return first_object;
  1559. }
  1560. inline friend BigFloat operator / (BigFloat first_object, BigFloat second_object)
  1561. {
  1562. first_object.Numerator *= second_object.Denominator;
  1563. first_object.Denominator *= second_object.Numerator;
  1564. first_object.shrink_to_fit();
  1565. return first_object;
  1566. }
  1567. inline friend BigFloat operator % (BigFloat object, BigInt MOD)
  1568. {
  1569. object.Numerator *= pow(object.Denominator, phi(MOD) - 1);
  1570. object.Numerator %= MOD;
  1571. object.Denominator = 1;
  1572. return object;
  1573. }
  1574. template<typename T>
  1575. inline friend BigFloat operator + (BigFloat first_object, T number)
  1576. {
  1577. BigFloat second_object;
  1578. second_object = number;
  1579. return first_object + second_object;
  1580. }
  1581. template<typename T>
  1582. inline friend BigFloat operator - (BigFloat first_object, T number)
  1583. {
  1584. BigFloat second_object;
  1585. second_object = number;
  1586. return first_object - second_object;
  1587. }
  1588. template<typename T>
  1589. inline friend BigFloat operator * (BigFloat first_object, T number)
  1590. {
  1591. BigFloat second_object;
  1592. second_object = number;
  1593. return first_object * second_object;
  1594. }
  1595. template<typename T>
  1596. inline friend BigFloat operator / (BigFloat first_object, T number)
  1597. {
  1598. BigFloat second_object;
  1599. second_object = number;
  1600. return first_object / second_object;
  1601. }
  1602. inline friend BigFloat operator % (BigFloat object, int MOD)
  1603. {
  1604. object.Numerator *= pow(object.Denominator, phi(MOD) - 1);
  1605. object.Numerator %= MOD;
  1606. object.Denominator = 1;
  1607. return object;
  1608. }
  1609. template<typename T>
  1610. inline friend BigFloat operator + (T number, BigFloat second_object)
  1611. {
  1612. BigFloat first_object;
  1613. first_object = number;
  1614. return first_object + second_object;
  1615. }
  1616. template<typename T>
  1617. inline friend BigFloat operator - (T number, BigFloat second_object)
  1618. {
  1619. BigFloat first_object;
  1620. first_object = number;
  1621. return first_object - second_object;
  1622. }
  1623. template<typename T>
  1624. inline friend BigFloat operator * (T number, BigFloat second_object)
  1625. {
  1626. BigFloat first_object;
  1627. first_object = number;
  1628. return first_object * second_object;
  1629. }
  1630. template<typename T>
  1631. inline friend BigFloat operator / (T number, BigFloat second_object)
  1632. {
  1633. BigFloat first_object;
  1634. first_object = number;
  1635. return first_object / second_object;
  1636. }
  1637. inline friend BigFloat operator + (BigFloat first_object, BigInt number)
  1638. {
  1639. BigFloat second_object;
  1640. second_object = number;
  1641. return first_object + second_object;
  1642. }
  1643. inline friend BigFloat operator - (BigFloat first_object, BigInt number)
  1644. {
  1645. BigFloat second_object;
  1646. second_object = number;
  1647. return first_object - second_object;
  1648. }
  1649. inline friend BigFloat operator * (BigFloat first_object, BigInt number)
  1650. {
  1651. BigFloat second_object;
  1652. second_object = number;
  1653. return first_object * second_object;
  1654. }
  1655. inline friend BigFloat operator / (BigFloat first_object, BigInt number)
  1656. {
  1657. BigFloat second_object;
  1658. second_object = number;
  1659. return first_object / second_object;
  1660. }
  1661. inline friend BigFloat operator + (BigInt number, BigFloat second_object)
  1662. {
  1663. BigFloat first_object;
  1664. first_object = number;
  1665. return first_object + second_object;
  1666. }
  1667. inline friend BigFloat operator - (BigInt number, BigFloat second_object)
  1668. {
  1669. BigFloat first_object;
  1670. first_object = number;
  1671. return first_object - second_object;
  1672. }
  1673. inline friend BigFloat operator * (BigInt number, BigFloat second_object)
  1674. {
  1675. BigFloat first_object;
  1676. first_object = number;
  1677. return first_object * second_object;
  1678. }
  1679. inline friend BigFloat operator / (BigInt number, BigFloat second_object)
  1680. {
  1681. BigFloat first_object;
  1682. first_object = number;
  1683. return first_object / second_object;
  1684. }
  1685. template<typename T>
  1686. inline BigFloat& operator += (T number)
  1687. {
  1688. *this = *this + number;
  1689. return *this;
  1690. }
  1691. template<typename T>
  1692. inline BigFloat& operator -= (T number)
  1693. {
  1694. *this = *this - number;
  1695. return *this;
  1696. }
  1697. template<typename T>
  1698. inline BigFloat& operator *= (T number)
  1699. {
  1700. *this = *this * number;
  1701. return *this;
  1702. }
  1703. template<typename T>
  1704. inline BigFloat& operator /= (T number)
  1705. {
  1706. *this = *this / number;
  1707. return *this;
  1708. }
  1709. template<typename T>
  1710. inline BigFloat& operator %= (T number)
  1711. {
  1712. *this = *this % number;
  1713. return *this;
  1714. }
  1715. inline BigFloat& operator += (BigInt number)
  1716. {
  1717. *this = *this + number;
  1718. return *this;
  1719. }
  1720. inline BigFloat& operator -= (BigInt number)
  1721. {
  1722. *this = *this - number;
  1723. return *this;
  1724. }
  1725. inline BigFloat& operator *= (BigInt number)
  1726. {
  1727. *this = *this * number;
  1728. return *this;
  1729. }
  1730. inline BigFloat& operator /= (BigInt number)
  1731. {
  1732. *this = *this / number;
  1733. return *this;
  1734. }
  1735. inline BigFloat& operator %= (BigInt number)
  1736. {
  1737. *this = *this % number;
  1738. return *this;
  1739. }
  1740. inline BigFloat& operator ++ ()
  1741. {
  1742. Numerator += Denominator;
  1743. return (*this);
  1744. }
  1745. inline BigFloat operator ++ (int32_t)
  1746. {
  1747. Numerator += Denominator;
  1748. return (*this) - 1;
  1749. }
  1750. inline BigFloat& operator -- ()
  1751. {
  1752. Numerator -= Denominator;
  1753. return (*this);
  1754. }
  1755. inline BigFloat operator -- (int32_t)
  1756. {
  1757. Numerator -= Denominator;
  1758. return (*this) + 1;
  1759. }
  1760. };
  1761. inline BigFloat abs(BigFloat number)
  1762. {
  1763. BigInt Numerator = number.numerator();
  1764. Numerator.is_negative = false;
  1765. number.numerator(Numerator);
  1766. BigInt Denominator = number.denominator();
  1767. Denominator.is_negative = false;
  1768. number.denominator(Denominator);
  1769. return number;
  1770. }
  1771. BigFloat floor(BigFloat number, int Digits = 0)
  1772. {
  1773. if (number.denominator() == 0)
  1774. {
  1775. return number;
  1776. }
  1777. number = number.str(Digits);
  1778. return number;
  1779. }
  1780. BigFloat ceil(BigFloat number, int Digits = 0)
  1781. {
  1782. if (number.denominator() == 0)
  1783. {
  1784. return number;
  1785. }
  1786. BigFloat number2;
  1787. number2.numerator(1);
  1788. std::string temp = "1";
  1789. while (Digits--)
  1790. {
  1791. temp.push_back('0');
  1792. }
  1793. number2.denominator(temp);
  1794. number += number2;
  1795. number2.denominator(number.denominator());
  1796. number -= number2;
  1797. return number;
  1798. }
  1799. BigFloat round(BigFloat number, int Digits = 0)
  1800. {
  1801. if (number.denominator() == 0)
  1802. {
  1803. return number;
  1804. }
  1805. std::string temp = number.str(Digits + 1);
  1806. if (temp[temp.size() - 1] >= '5')
  1807. {
  1808. temp = '0' + temp;
  1809. for (int i = temp.size() - 2; i >= 0; i--)
  1810. {
  1811. if (temp[i] == '.')
  1812. {
  1813. continue;
  1814. }
  1815. if (temp[i] != '9')
  1816. {
  1817. temp[i]++;
  1818. break;
  1819. }
  1820. else
  1821. {
  1822. temp[i] = '0';
  1823. }
  1824. }
  1825. }
  1826. temp.pop_back();
  1827. number = temp;
  1828. return number;
  1829. }
  1830. BigFloat sqrt(BigInt number, int depth = 7)
  1831. {
  1832. BigFloat temp = 0;
  1833. BigFloat ans = 1;
  1834. while (ans != temp)
  1835. {
  1836. temp = ans;
  1837. ans = (5 * temp) / 4 + number / (4 * temp) - (temp * temp * temp) / (temp * temp + number);
  1838. ans = floor(ans, depth);
  1839. }
  1840. return ans;
  1841. }
  1842. BigFloat sqrt(BigFloat number, int depth = 7)
  1843. {
  1844. BigFloat temp = 0;
  1845. BigFloat ans = 1;
  1846. while (ans != temp)
  1847. {
  1848. temp = ans;
  1849. ans = (5 * temp) / 4 + number / (4 * temp) - (temp * temp * temp) / (temp * temp + number);
  1850. ans = floor(ans, depth);
  1851. }
  1852. return ans;
  1853. }
  1854. BigFloat cbrt(BigInt number, int depth = 7)
  1855. {
  1856. BigFloat temp = 0;
  1857. BigFloat ans = 1;
  1858. while (ans != temp)
  1859. {
  1860. temp = ans;
  1861. ans = temp - (temp * temp * temp - number) / (3 * temp * temp);
  1862. ans = floor(ans, depth);
  1863. }
  1864. return ans;
  1865. }
  1866. BigFloat cbrt(BigFloat number, int depth = 7)
  1867. {
  1868. BigFloat temp = 0;
  1869. BigFloat ans = 1;
  1870. while (ans != temp)
  1871. {
  1872. temp = ans;
  1873. ans = temp - (temp * temp * temp - number) / (3 * temp * temp);
  1874. ans = floor(ans, depth);
  1875. }
  1876. return ans;
  1877. }
  1878. int main()
  1879. {
  1880. return 0;
  1881. }
  1882.  
Success #stdin #stdout 0.01s 5300KB
stdin
Standard input is empty
stdout
Standard output is empty