Advertisement
Guest User

Untitled

a guest
Oct 15th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.36 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4.  
  5. using namespace std;
  6.  
  7. template<typename T>
  8. class Polynomial {
  9. private:
  10. map<size_t, T> data;
  11.  
  12. public:
  13. Polynomial() {}
  14. Polynomial(const vector <T>& vec) {
  15. for (size_t i = 0; i < vec.size(); ++i) {
  16. if (vec[i] != T(0)) {
  17. data[i] = vec[i];
  18. }
  19. }
  20. }
  21. Polynomial(const T x) {
  22. if (x != T(0)) {
  23. data[0] = x;
  24. }
  25. }
  26. template<typename Iter>
  27. Polynomial(Iter first, Iter last) {
  28. size_t k = 0;
  29. while (first != last) {
  30. if (*first != T(0)) {
  31. data[k] = *first;
  32. }
  33. ++k;
  34. ++first;
  35. }
  36. }
  37. bool operator == (const Polynomial& p1) const {
  38. return p1.data == data;
  39. }
  40. bool operator != (const Polynomial& p1) const {
  41. return p1.data != data;
  42. }
  43. Polynomial& operator += (const Polynomial& other) {
  44. for (const auto& i : other.data) {
  45. if (i.second + data[i.first] == T(0)) {
  46. data.erase(i.first);
  47. } else {
  48. data[i.first] += i.second;
  49. }
  50. }
  51. return *this;
  52. }
  53. friend Polynomial operator + (const Polynomial& p1, const Polynomial& p2) {
  54. auto tmp(p1);
  55. tmp += p2;
  56. return tmp;
  57. }
  58. Polynomial& operator -= (const Polynomial& other) {
  59. for (const auto& i : other.data) {
  60. if (i.second - data[i.first] == T(0)) {
  61. data.erase(i.first);
  62. } else {
  63. data[i.first] -= i.second;
  64. }
  65. }
  66. return *this;
  67. }
  68. friend Polynomial operator - (const Polynomial& p1, const Polynomial& p2) {
  69. auto tmp(p1);
  70. tmp -= p2;
  71. return tmp;
  72. }
  73. const typename map<size_t, T>::const_iterator begin() const {
  74. return data.begin();
  75. }
  76.  
  77. const typename map<size_t, T>::const_iterator end() const {
  78. return data.end();
  79. }
  80. T operator[] (const size_t pos) const {
  81. if (data.find(pos) == data.end()) {
  82. return T(0);
  83. }
  84. return data.at(pos);
  85. }
  86. size_t Degree() const {
  87. if (data.empty()) {
  88. return T(-1);
  89. }
  90. auto it = data.end();
  91. --it;
  92. return it->first;
  93. }
  94. Polynomial& operator *= (const Polynomial& other) {
  95. Polynomial Copy_p;
  96. for (const auto& i : data) {
  97. for (const auto& j : other.data) {
  98. Copy_p.data[i.first + j.first] += i.second * j.second;
  99. }
  100. }
  101. (*this).data.clear();
  102. for (const auto& i : Copy_p) {
  103. if (i.second != T(0)) {
  104. data[i.first] = i.second;
  105. }
  106. }
  107. return *this;
  108. }
  109. friend Polynomial operator * (const Polynomial& p1, const Polynomial& p2) {
  110. auto tmp(p1);
  111. tmp *= p2;
  112. return tmp;
  113. }
  114. T operator () (const T& x) const {
  115. T ans(0);
  116. for (const auto& i : data) {
  117. T st(1);
  118. for (size_t j = 0; j < i.first; ++j) {
  119. st *= x;
  120. }
  121. ans += st * i.second;
  122. }
  123. return ans;
  124. }
  125. friend ostream& operator << (ostream& out, const Polynomial& p) {
  126. if (p.data.empty()) {
  127. out << '0';
  128. return out;
  129. }
  130. auto it = p.data.end();
  131. auto start = --it;
  132. ++it;
  133. do {
  134. --it;
  135. size_t st = it->first;
  136. T a = it->second;
  137. if (st == 0) {
  138. if (it != start && a > T(0)) {
  139. out << '+' << a;
  140. } else {
  141. out << a;
  142. }
  143. continue;
  144. }
  145. if (a == T(1) && it == start) {
  146. } else {
  147. if (a == T(1) && it != start) {
  148. out << '+';
  149. } else {
  150. if (a == T(-1)) {
  151. out << '-';
  152. } else {
  153. if (a > T(0) && start != it) {
  154. out << '+' << a;
  155. } else {
  156. out << a;
  157. }
  158. }
  159. }
  160. }
  161. if (a != T(1) && a != T(-1)) {
  162. out << '*';
  163. }
  164. if (st == 1) {
  165. out << "x";
  166. } else {
  167. if (st != 0) {
  168. out << "x^" << st;
  169. }
  170. }
  171. } while (it != p.data.begin());
  172. return out;
  173. }
  174. friend Polynomial operator & (const Polynomial& p1, const Polynomial& p2) {
  175. Polynomial tmp(T(0));
  176. for (const auto& i : p1.data) {
  177. Polynomial st(1);
  178. for (size_t j = 0; j < i.first; ++j) {
  179. st *= p2;
  180. }
  181. tmp += st * i.second;
  182. }
  183. return tmp;
  184. }
  185. };
  186. int main() {
  187. int n, m;
  188. cin >> n >> m;
  189. vector <int> vec1(n);
  190. for (int i = 0; i < n; ++i) {
  191. cin >> vec1[i];
  192. }
  193. vector <int> vec2(m);
  194. for (int i = 0; i < m; ++i) {
  195. cin >> vec2[i];
  196. }
  197. Polynomial<int> x(vec1);
  198. Polynomial<int> y(vec2);
  199. cout << (x & y) << endl;
  200. return 0;
  201. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement