fork download
  1. #include <string>
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <type_traits>
  5.  
  6. template<typename T, typename = std::enable_if_t<std::is_integral<T>::value>>
  7. T gcd(T m, T n)
  8. {
  9. while(m && n) if (m < n) n %= m; else m %= n;
  10. return m + n;
  11. }
  12.  
  13. template<typename T, typename = std::enable_if_t<std::is_integral<T>::value>>
  14. T lcm(T m, T n)
  15. {
  16. return (m/gcd(m,n))*n;
  17. }
  18.  
  19. class frac
  20. {
  21. public:
  22. frac(long long d, unsigned long long q = 1ull);
  23. frac(const frac&) = default;
  24. frac& operator=(const frac&) = default;
  25.  
  26. operator std::string() const;
  27.  
  28.  
  29. private:
  30. unsigned long long d, q;
  31. int sign;
  32. void norm();
  33.  
  34. friend frac operator +(const frac&a, const frac&b);
  35. friend frac operator -(const frac&a, const frac&b);
  36. friend frac operator *(const frac&a, const frac&b);
  37. friend frac operator /(const frac&a, const frac&b);
  38.  
  39. friend bool operator ==(const frac&a, const frac&b);
  40. friend bool operator !=(const frac&a, const frac&b);
  41.  
  42. };
  43.  
  44. frac::frac(long long dd, unsigned long long qq)
  45. {
  46. sign = (dd < 0) ? -1 : +1;
  47. d = dd*sign;
  48. q = qq;
  49. norm();
  50. };
  51.  
  52. void frac::norm()
  53. {
  54. unsigned long long g = gcd(d,q);
  55. if (g != 1) { d /= g; q /= g; }
  56. }
  57.  
  58.  
  59. frac operator +(const frac&a, const frac&b)
  60. {
  61. long long dd;
  62. unsigned long long qq;
  63. if (a.q == b.q)
  64. {
  65. dd = a.d*a.sign + b.d*b.sign;
  66. qq = a.q;
  67. }
  68. else
  69. {
  70. qq = lcm(a.q,b.q);
  71. dd = a.d*a.sign*(qq/a.q) + b.d*b.sign*(qq/b.q);
  72. }
  73. return frac(dd,qq);
  74. }
  75.  
  76. frac operator -(const frac&a, const frac&b)
  77. {
  78. long long dd;
  79. unsigned long long qq;
  80. if (a.q == b.q)
  81. {
  82. dd = a.d*a.sign - b.d*b.sign;
  83. qq = a.q;
  84. }
  85. else
  86. {
  87. qq = lcm(a.q,b.q);
  88. dd = a.d*a.sign*(qq/a.q) - b.d*b.sign*(qq/b.q);
  89. }
  90. return frac(dd,qq);
  91. }
  92.  
  93. frac operator *(const frac&a, const frac&b)
  94. {
  95. return frac(a.d*a.sign*b.d*b.sign,a.q*b.q);
  96. }
  97.  
  98. frac operator /(const frac&a, const frac&b)
  99. {
  100. return frac(a.sign*b.sign*a.d*b.q,a.q*b.d);
  101. }
  102.  
  103. bool operator ==(const frac&a, const frac&b)
  104. {
  105. return a.d==b.d && a.q == b.q && a.sign == b.sign;
  106. }
  107.  
  108. bool operator !=(const frac&a, const frac&b)
  109. {
  110. return !(a==b);
  111. }
  112.  
  113. frac::operator std::string() const
  114. {
  115. std::string s = (sign > 0) ? "" : "-";
  116. s = s + std::to_string(d) + "/" + std::to_string(q);
  117. return s;
  118. }
  119.  
  120.  
  121. using namespace std;
  122.  
  123.  
  124. int main(int argc, const char * argv[])
  125. {
  126. int n;
  127. cin >> n;
  128. frac f(0);
  129. for(int i = 1; i <= n; ++i)
  130. {
  131. frac t(i-1,i*(i+1));
  132. f = f + t;
  133. }
  134. cout << string(f) << endl;
  135. }
  136.  
  137.  
Success #stdin #stdout 0s 5652KB
stdin
45
stdout
3281281745920812427/1345655451257488800