fork(1) download
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. struct Term {
  8. long long c;
  9. string v;
  10. };
  11.  
  12. Term parseTerm(const string& s) {
  13. long long c = 0;
  14. int sign = 1;
  15. size_t i = 0;
  16. if (i < s.size() && s[i] == '+') i++;
  17. else if (i < s.size() && s[i] == '-') { sign = -1; i++; }
  18.  
  19. bool has_digit = false;
  20. while(i < s.size() && isdigit(s[i])) {
  21. c = c * 10 + (s[i] - '0');
  22. has_digit = true;
  23. i++;
  24. }
  25. if (!has_digit) c = 1;
  26. c *= sign;
  27. return {c, s.substr(i)};
  28. }
  29.  
  30. string formatSq(const Term& t, bool isFirst) {
  31. long long c2 = t.c * t.c;
  32. if (c2 == 0) return "";
  33. string res = "";
  34. if (c2 > 0 && !isFirst) res += "+";
  35.  
  36. if (t.v.empty()) {
  37. res += to_string(c2);
  38. } else {
  39. if (c2 != 1) res += to_string(c2);
  40. res += t.v + "^2";
  41. }
  42. return res;
  43. }
  44.  
  45. string formatCross(const Term& t1, const Term& t2, bool isFirst) {
  46. long long c = 2 * t1.c * t2.c;
  47. if (c == 0) return "";
  48. string res = "";
  49. if (c > 0 && !isFirst) res += "+";
  50. else if (c < 0) { res += "-"; c = -c; }
  51.  
  52. if (t1.v.empty() && t2.v.empty()) {
  53. res += to_string(c);
  54. } else {
  55. if (c != 1) res += to_string(c);
  56. res += t1.v + t2.v;
  57. }
  58. return res;
  59. }
  60.  
  61. int main() {
  62. ios_base::sync_with_stdio(false);
  63. cin.tie(NULL);
  64. string line;
  65. while (getline(cin, line)) {
  66. string full = "";
  67. for (char c : line) {
  68. if (c != ' ' && c != '\t' && c != '\r') full += c;
  69. }
  70. if (full.empty()) continue;
  71.  
  72. size_t p1 = full.find('(');
  73. size_t p2 = full.find(')');
  74. if (p1 == string::npos || p2 == string::npos || p2 < p1) {
  75. p1 = -1;
  76. p2 = full.length();
  77. size_t p_sq = full.find("^2");
  78. if(p_sq != string::npos) p2 = p_sq;
  79. }
  80.  
  81. string in = full.substr(p1 + 1, p2 - p1 - 1);
  82. vector<Term> T;
  83. string current = "";
  84. for(char ch : in) {
  85. if(ch == '+' || ch == '-') {
  86. if(!current.empty()) {
  87. T.push_back(parseTerm(current));
  88. }
  89. current = (ch == '-') ? "-" : "";
  90. } else {
  91. current += ch;
  92. }
  93. }
  94. if(!current.empty()) {
  95. T.push_back(parseTerm(current));
  96. }
  97.  
  98. if (T.empty()) continue;
  99.  
  100. string ans = "";
  101. if (T.size() == 2) {
  102. ans += formatSq(T[0], true);
  103. ans += formatCross(T[0], T[1], false);
  104. ans += formatSq(T[1], false);
  105. } else {
  106. bool isFirst = true;
  107. for (size_t i = 0; i < T.size(); i++) {
  108. ans += formatSq(T[i], isFirst);
  109. isFirst = false;
  110. }
  111. for (size_t i = 0; i < T.size(); i++) {
  112. for (size_t j = i + 1; j < T.size(); j++) {
  113. ans += formatCross(T[i], T[j], isFirst);
  114. isFirst = false;
  115. }
  116. }
  117. }
  118.  
  119. if (full.find("ex:") == 0) {
  120. cout << "res:" << ans << "\n";
  121. } else {
  122. cout << ans << "\n";
  123. }
  124. }
  125. return 0;
  126. }
Success #stdin #stdout 0.01s 5324KB
stdin
Standard input is empty
stdout
Standard output is empty