#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
int str_to_int( char * s, int begin, int end) { //Принимает адрес первого элемента строки и индексы первого и последнего символов, между которыми в ней (предположительно) записано число (последний не включительно).
int val = 0 ; //Возвращает объект типа int, значение которого равно этому числу.
bool negative = 0 ; //Является ли число отрицательным?
if ( s[ begin] == '+' ) begin++ ; //Плюс игнорируется.
else {
if ( s[ begin] == '-' ) { //Проверка на отрицательность.
negative = 1 ;
begin++ ;
}
}
for ( auto i = begin; i < end; ++ i) { //Обработка самих цифр числа.
val * = 10 ;
val + = s[ i] - 48 ;
}
if ( val == 0 && s[ begin] ! = '0' ) val++ ; //Если значение получилось равным нулю, но в исходной строке не только ноль, значит, обрабатывается строка вида "+x", в которой при записи опускается единица
if ( negative == 1 ) val * = - 1 ;
return val;
}
void int_to_str( int val, char * s) { //Записывает в строку s число val.
char tmp[ 5 ] ;
if ( val > 0 ) s[ 0 ] = '+' ; //Проверка на отрицательность.
else {
val * = - 1 ;
s[ 0 ] = '-' ;
}
int i = 0 ;
while ( val > 0 ) {
tmp[ i] = ( val% 10 + 48 ) ; //В tmp хранится запись числа в обратном порядке.
val / = 10 ;
i++ ;
}
tmp[ i] = 0 ;
int j = 1 ;
for ( i = strlen ( tmp) - 1 ; i >= 0 ; -- i) { //Переписывание элементво из tmp в s в верном порядке.
s[ j] = tmp[ i] ;
j++ ;
}
s[ j] = 0 ; //Если строка получилась короче пяти символов, нужно поставить после последнего нулевой символ.
}
void erase_the_plus( char * s) { //Удаляет плюс, стоящий в начале строки.
if ( s[ 0 ] == '+' ) {
for ( int i = 0 ; s[ i] ! = 0 ; ++ i) {
s[ i] = s[ i+ 1 ] ;
}
}
}
void erase_the_one( char * s) { //Удаляет единицу из строк вида "+1x", "-1x^y".
if ( ( s[ 1 ] == '1' ) && ( strlen ( s) == 2 ) ) {
s[ 1 ] = 0 ;
}
}
void analyze( char * s, vector < int > & v) { //Анализирует строку и увеличивает соответствующие элементы вектора на коэфициенты при степенях х.
if ( strchr ( s, 'x' ) == NULL ) v[ 0 ] + = str_to_int( s, 0 , strlen ( s) ) ; //Если в строке содержится запись константаы.
else {
if ( strchr ( s, '^' ) == NULL ) v[ 1 ] + = str_to_int( s, 0 , strchr ( s, 'x' ) - s) ; //Строка вида "ax".
else {
int power = str_to_int( s, strchr ( s, '^' ) - s + 1 , strlen ( s) ) ;
v[ power] + = str_to_int( s, 0 , strchr ( s, 'x' ) - s) ;
}
}
}
vector < int > decompose( char * s) { //Разбивает многочлен на слогаемые и возвращает вектор, индексы элементов которого соответствуют степеням х, а сами элементы - коэффициентам при них.
vector < int > v( 11 ) ;
char cur_s[ 10 ] ;
int i = 0 , j;
while ( s[ i] ! = 0 ) {
//cur_s[0] = 0;
cur_s[ 0 ] = s[ i] ;
i++ ;
j = 1 ;
while ( ( s[ i] ! = '+' ) && ( s[ i] ! = '-' ) && ( s[ i] ! = 0 ) ) { //cur_s - анализируемое в данный момент слогаемое.
cur_s[ j] = s[ i] ;
i++ ;
j++ ;
}
cur_s[ j] = 0 ;
analyze( cur_s, v) ;
}
return v;
}
vector < int > multiplicate ( vector < int > & a, vector < int > & b) { //Умножение многочленов.
vector < int > c( 21 ) ; //Возвращает вектор, индексы элементов которого соответствуют степеням х, а сами элементы - коэффициентам при них.
for ( int i = 0 ; i < c.size ( ) ; ++ i) c[ i] = 0 ;
for ( int i = 0 ; i < a.size ( ) ; ++ i) {
for ( int j = 0 ; j < b.size ( ) ; ++ j) {
c[ i + j] + = a[ i] * b[ j] ;
}
}
return c;
}
void compose( char * s, vector < int > & v) { //Из элементов вектора составляет строку, в которой записан многочлен.
for ( int i = v.size ( ) - 1 ; i >= 2 ; -- i) {
if ( v[ i] ! = 0 ) {
char coef[ 6 ] ; //Коэффициент.
int_to_str( v[ i] , coef) ;
erase_the_one( coef) ;
strcat ( s, coef) ;
strcat ( s, "x" ) ;
strcat ( s, "^" ) ;
char power[ 2 ] ; //Степень х.
int_to_str( i, power) ;
erase_the_plus( power) ;
strcat ( s, power) ;
}
}
if ( v[ 1 ] ! = 0 ) { //Записи слогаемых с первой и нулевой степенями х отличаются.
char coef[ 10 ] ;
int_to_str( v[ 1 ] , coef) ;
erase_the_one( coef) ;
strcat ( s, coef) ;
strcat ( s, "x" ) ;
}
if ( v[ 0 ] ! = 0 ) {
char coef[ 10 ] ;
int_to_str( v[ 0 ] , coef) ;
strcat ( s, coef) ;
}
}
int main( ) {
char * a, * b;
int max_number_of_symbols = 100 ;
a = new char [ max_number_of_symbols] ;
b = new char [ max_number_of_symbols] ;
vector < int > a_decomposed( 11 , 0 ) ;
vector < int > b_decomposed( 11 , 0 ) ;
cin .getline ( a, max_number_of_symbols) ; //Ввод многочленов.
cin .getline ( b, max_number_of_symbols) ;
a_decomposed = decompose( a) ;
b_decomposed = decompose( b) ;
vector < int > c_decomposed = multiplicate( a_decomposed, b_decomposed) ;
char * c;
c = new char [ max_number_of_symbols] ;
compose( c, c_decomposed) ;
erase_the_plus( c) ; //Удаляется первый плюс, если он есть.
if ( strlen ( c) > 0 ) cout << c;
else cout << 0 ; //Если в ответе получаем константу 0.
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KI2luY2x1ZGUgPHZlY3Rvcj4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBzdHJfdG9faW50KGNoYXIgKnMsIGludCBiZWdpbiwgaW50IGVuZCl7Ly/Qn9GA0LjQvdC40LzQsNC10YIg0LDQtNGA0LXRgSDQv9C10YDQstC+0LPQviDRjdC70LXQvNC10L3RgtCwINGB0YLRgNC+0LrQuCDQuCDQuNC90LTQtdC60YHRiyDQv9C10YDQstC+0LPQviDQuCDQv9C+0YHQu9C10LTQvdC10LPQviDRgdC40LzQstC+0LvQvtCyLCDQvNC10LbQtNGDINC60L7RgtC+0YDRi9C80Lgg0LIg0L3QtdC5ICjQv9GA0LXQtNC/0L7Qu9C+0LbQuNGC0LXQu9GM0L3Qvikg0LfQsNC/0LjRgdCw0L3QviDRh9C40YHQu9C+ICjQv9C+0YHQu9C10LTQvdC40Lkg0L3QtSDQstC60LvRjtGH0LjRgtC10LvRjNC90L4pLgoJaW50IHZhbCA9IDA7CQkvL9CS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC+0LHRitC10LrRgiDRgtC40L/QsCBpbnQsINC30L3QsNGH0LXQvdC40LUg0LrQvtGC0L7RgNC+0LPQviDRgNCw0LLQvdC+INGN0YLQvtC80YMg0YfQuNGB0LvRgy4KCWJvb2wgbmVnYXRpdmUgPSAwOwkvL9Cv0LLQu9GP0LXRgtGB0Y8g0LvQuCDRh9C40YHQu9C+INC+0YLRgNC40YbQsNGC0LXQu9GM0L3Ri9C8PwoJaWYoc1tiZWdpbl0gPT0gJysnKSBiZWdpbisrOy8v0J/Qu9GO0YEg0LjQs9C90L7RgNC40YDRg9C10YLRgdGPLgoJZWxzZXsKCQlpZihzW2JlZ2luXSA9PSAnLScpewkvL9Cf0YDQvtCy0LXRgNC60LAg0L3QsCDQvtGC0YDQuNGG0LDRgtC10LvRjNC90L7RgdGC0YwuCgkJCW5lZ2F0aXZlID0gMTsKCQkJYmVnaW4rKzsKCQl9Cgl9Cglmb3IoYXV0byBpID0gYmVnaW47IGkgPCBlbmQ7ICsraSl7CS8v0J7QsdGA0LDQsdC+0YLQutCwINGB0LDQvNC40YUg0YbQuNGE0YAg0YfQuNGB0LvQsC4KCQl2YWwgKj0gMTA7CgkJdmFsICs9IHNbaV0gLSA0ODsKCX0KCWlmKHZhbCA9PSAwICYmIHNbYmVnaW5dICE9ICcwJykgdmFsKys7IC8v0JXRgdC70Lgg0LfQvdCw0YfQtdC90LjQtSDQv9C+0LvRg9GH0LjQu9C+0YHRjCDRgNCw0LLQvdGL0Lwg0L3Rg9C70Y4sINC90L4g0LIg0LjRgdGF0L7QtNC90L7QuSDRgdGC0YDQvtC60LUg0L3QtSDRgtC+0LvRjNC60L4g0L3QvtC70YwsINC30L3QsNGH0LjRgiwg0L7QsdGA0LDQsdCw0YLRi9Cy0LDQtdGC0YHRjyDRgdGC0YDQvtC60LAg0LLQuNC00LAgIit4Iiwg0LIg0LrQvtGC0L7RgNC+0Lkg0L/RgNC4INC30LDQv9C40YHQuCDQvtC/0YPRgdC60LDQtdGC0YHRjyDQtdC00LjQvdC40YbQsAoJaWYobmVnYXRpdmUgPT0gMSkgdmFsICo9IC0xOwoJcmV0dXJuIHZhbDsKfQoKdm9pZCBpbnRfdG9fc3RyKGludCB2YWwsIGNoYXIgKnMpeyAvL9CX0LDQv9C40YHRi9Cy0LDQtdGCINCyINGB0YLRgNC+0LrRgyBzINGH0LjRgdC70L4gdmFsLgoJY2hhciB0bXBbNV07CglpZih2YWwgPiAwKSBzWzBdID0gJysnOwkvL9Cf0YDQvtCy0LXRgNC60LAg0L3QsCDQvtGC0YDQuNGG0LDRgtC10LvRjNC90L7RgdGC0YwuCgllbHNlewoJCXZhbCAqPSAtMTsKCQlzWzBdID0gJy0nOwoJfQoJaW50IGkgPSAwOwoJd2hpbGUodmFsID4gMCl7CgkJdG1wW2ldID0gKHZhbCUxMCArIDQ4KTsJLy/QkiB0bXAg0YXRgNCw0L3QuNGC0YHRjyDQt9Cw0L/QuNGB0Ywg0YfQuNGB0LvQsCDQsiDQvtCx0YDQsNGC0L3QvtC8INC/0L7RgNGP0LTQutC1LgoJCXZhbCAvPSAxMDsKCQlpKys7Cgl9Cgl0bXBbaV0gPSAwOwoJaW50IGogPSAxOwoJZm9yKGkgPSBzdHJsZW4odG1wKS0xOyBpID49IDA7IC0taSl7CS8v0J/QtdGA0LXQv9C40YHRi9Cy0LDQvdC40LUg0Y3Qu9C10LzQtdC90YLQstC+INC40LcgdG1wINCyIHMg0LIg0LLQtdGA0L3QvtC8INC/0L7RgNGP0LTQutC1LgoJCXNbal0gPSB0bXBbaV07CgkJaisrOwoJfQoJc1tqXSA9IDA7IC8v0JXRgdC70Lgg0YHRgtGA0L7QutCwINC/0L7Qu9GD0YfQuNC70LDRgdGMINC60L7RgNC+0YfQtSDQv9GP0YLQuCDRgdC40LzQstC+0LvQvtCyLCDQvdGD0LbQvdC+INC/0L7RgdGC0LDQstC40YLRjCDQv9C+0YHQu9C1INC/0L7RgdC70LXQtNC90LXQs9C+INC90YPQu9C10LLQvtC5INGB0LjQvNCy0L7Quy4KfQoKdm9pZCBlcmFzZV90aGVfcGx1cyhjaGFyICpzKXsJLy/Qo9C00LDQu9GP0LXRgiDQv9C70Y7RgSwg0YHRgtC+0Y/RidC40Lkg0LIg0L3QsNGH0LDQu9C1INGB0YLRgNC+0LrQuC4KCWlmKHNbMF0gPT0gJysnKXsKCQlmb3IoaW50IGkgPSAwOyBzW2ldICE9IDA7ICsraSl7CgkJCXNbaV0gPSBzW2krMV07CgkJfQoJfQp9Cgp2b2lkIGVyYXNlX3RoZV9vbmUoY2hhciAqcyl7CQkvL9Cj0LTQsNC70Y/QtdGCINC10LTQuNC90LjRhtGDINC40Lcg0YHRgtGA0L7QuiDQstC40LTQsCAiKzF4IiwgIi0xeF55Ii4KCWlmKChzWzFdID09ICcxJykgJiYgKHN0cmxlbihzKSA9PSAyKSl7CgkJc1sxXSA9IDA7Cgl9Cn0KCnZvaWQgYW5hbHl6ZShjaGFyICpzLCB2ZWN0b3IgPGludD4gJnYpewkJLy/QkNC90LDQu9C40LfQuNGA0YPQtdGCINGB0YLRgNC+0LrRgyDQuCDRg9Cy0LXQu9C40YfQuNCy0LDQtdGCINGB0L7QvtGC0LLQtdGC0YHRgtCy0YPRjtGJ0LjQtSDRjdC70LXQvNC10L3RgtGLINCy0LXQutGC0L7RgNCwINC90LAg0LrQvtGN0YTQuNGG0LjQtdC90YLRiyDQv9GA0Lgg0YHRgtC10L/QtdC90Y/RhSDRhS4KCWlmKHN0cmNocihzLCAneCcpID09IE5VTEwpIHZbMF0gKz0gc3RyX3RvX2ludChzLCAwLCBzdHJsZW4ocykpOwkJLy/QldGB0LvQuCDQsiDRgdGC0YDQvtC60LUg0YHQvtC00LXRgNC20LjRgtGB0Y8g0LfQsNC/0LjRgdGMINC60L7QvdGB0YLQsNC90YLQsNGLLgoJZWxzZXsKCQlpZihzdHJjaHIocywgJ14nKSA9PSBOVUxMKSB2WzFdICs9IHN0cl90b19pbnQocywgMCwgc3RyY2hyKHMsICd4JykgLSBzKTsvL9Ch0YLRgNC+0LrQsCDQstC40LTQsCAiYXgiLgoJCWVsc2V7CgkJCWludCBwb3dlciA9IHN0cl90b19pbnQocywgc3RyY2hyKHMsICdeJykgLSBzICsgMSwgc3RybGVuKHMpKTsKCQkJdltwb3dlcl0gKz0gc3RyX3RvX2ludChzLCAwLCBzdHJjaHIocywgJ3gnKSAtIHMpOwoJCX0KCX0KfQogCnZlY3RvciA8aW50PiBkZWNvbXBvc2UoY2hhciAqcyl7Ly/QoNCw0LfQsdC40LLQsNC10YIg0LzQvdC+0LPQvtGH0LvQtdC9INC90LAg0YHQu9C+0LPQsNC10LzRi9C1INC4INCy0L7Qt9Cy0YDQsNGJ0LDQtdGCINCy0LXQutGC0L7RgCwg0LjQvdC00LXQutGB0Ysg0Y3Qu9C10LzQtdC90YLQvtCyINC60L7RgtC+0YDQvtCz0L4g0YHQvtC+0YLQstC10YLRgdGC0LLRg9GO0YIg0YHRgtC10L/QtdC90Y/QvCDRhSwg0LAg0YHQsNC80Lgg0Y3Qu9C10LzQtdC90YLRiyAtINC60L7RjdGE0YTQuNGG0LjQtdC90YLQsNC8INC/0YDQuCDQvdC40YUuCgl2ZWN0b3IgPGludD4gdigxMSk7CgljaGFyIGN1cl9zWzEwXTsKCWludCBpID0gMCwgajsKCXdoaWxlKHNbaV0gIT0gMCl7CgkJLy9jdXJfc1swXSA9IDA7CgkJY3VyX3NbMF0gPSBzW2ldOwoJCWkrKzsKCQlqID0gMTsKCQl3aGlsZSgoc1tpXSAhPSAnKycpICYmIChzW2ldICE9ICctJykgJiYgKHNbaV0gIT0gMCkpewkvL2N1cl9zIC0g0LDQvdCw0LvQuNC30LjRgNGD0LXQvNC+0LUg0LIg0LTQsNC90L3Ri9C5INC80L7QvNC10L3RgiDRgdC70L7Qs9Cw0LXQvNC+0LUuCgkJCWN1cl9zW2pdID0gc1tpXTsKCQkJaSsrOwoJCQlqKys7CgkJfQoJCWN1cl9zW2pdID0gMDsKCQlhbmFseXplKGN1cl9zLCB2KTsKCX0KCXJldHVybiB2Owp9CiAKdmVjdG9yIDxpbnQ+IG11bHRpcGxpY2F0ZSAodmVjdG9yIDxpbnQ+ICZhLCB2ZWN0b3IgPGludD4gJmIpewkvL9Cj0LzQvdC+0LbQtdC90LjQtSDQvNC90L7Qs9C+0YfQu9C10L3QvtCyLgoJdmVjdG9yIDxpbnQ+IGMoMjEpOwkvL9CS0L7Qt9Cy0YDQsNGJ0LDQtdGCINCy0LXQutGC0L7RgCwg0LjQvdC00LXQutGB0Ysg0Y3Qu9C10LzQtdC90YLQvtCyINC60L7RgtC+0YDQvtCz0L4g0YHQvtC+0YLQstC10YLRgdGC0LLRg9GO0YIg0YHRgtC10L/QtdC90Y/QvCDRhSwg0LAg0YHQsNC80Lgg0Y3Qu9C10LzQtdC90YLRiyAtINC60L7RjdGE0YTQuNGG0LjQtdC90YLQsNC8INC/0YDQuCDQvdC40YUuCglmb3IoaW50IGkgPSAwOyBpIDwgYy5zaXplKCk7ICsraSkgY1tpXSA9IDA7Cglmb3IoaW50IGkgPSAwOyBpIDwgYS5zaXplKCk7ICsraSl7CgkJZm9yKGludCBqID0gMDsgaiA8IGIuc2l6ZSgpOyArK2opewoJCQljW2kgKyBqXSArPSBhW2ldICogYltqXTsKCQl9Cgl9CglyZXR1cm4gYzsKfQogCnZvaWQgY29tcG9zZShjaGFyICpzLCB2ZWN0b3IgPGludD4gJnYpewkvL9CY0Lcg0Y3Qu9C10LzQtdC90YLQvtCyINCy0LXQutGC0L7RgNCwINGB0L7RgdGC0LDQstC70Y/QtdGCINGB0YLRgNC+0LrRgywg0LIg0LrQvtGC0L7RgNC+0Lkg0LfQsNC/0LjRgdCw0L0g0LzQvdC+0LPQvtGH0LvQtdC9LgoJZm9yKGludCBpID0gdi5zaXplKCkgLSAxOyBpID49IDI7IC0taSl7CgkJaWYodltpXSAhPSAwKXsKCQkJY2hhciBjb2VmWzZdOwkvL9Ca0L7RjdGE0YTQuNGG0LjQtdC90YIuCgkJCWludF90b19zdHIodltpXSwgY29lZik7CgkJCWVyYXNlX3RoZV9vbmUoY29lZik7CgkJCXN0cmNhdChzLCBjb2VmKTsKCQkJc3RyY2F0KHMsICJ4Iik7CgkJCXN0cmNhdChzLCAiXiIpOwoJCQljaGFyIHBvd2VyWzJdOwkvL9Ch0YLQtdC/0LXQvdGMINGFLgoJCQlpbnRfdG9fc3RyKGksIHBvd2VyKTsKCQkJZXJhc2VfdGhlX3BsdXMocG93ZXIpOwoJCQlzdHJjYXQocywgcG93ZXIpOwoJCX0KCX0KCWlmKHZbMV0gIT0gMCl7CS8v0JfQsNC/0LjRgdC4INGB0LvQvtCz0LDQtdC80YvRhSDRgSDQv9C10YDQstC+0Lkg0Lgg0L3Rg9C70LXQstC+0Lkg0YHRgtC10L/QtdC90Y/QvNC4INGFINC+0YLQu9C40YfQsNGO0YLRgdGPLgoJCWNoYXIgY29lZlsxMF07CgkJaW50X3RvX3N0cih2WzFdLCBjb2VmKTsKCQllcmFzZV90aGVfb25lKGNvZWYpOwoJCXN0cmNhdChzLCBjb2VmKTsKCQlzdHJjYXQocywgIngiKTsKCX0KCWlmKHZbMF0gIT0gMCl7CgkJY2hhciBjb2VmWzEwXTsKCQlpbnRfdG9fc3RyKHZbMF0sIGNvZWYpOwoJCXN0cmNhdChzLCBjb2VmKTsKCX0KfQogCmludCBtYWluKCkgewoJY2hhciAqYSwgKmI7CglpbnQgbWF4X251bWJlcl9vZl9zeW1ib2xzID0gMTAwOwoJYSA9IG5ldyBjaGFyW21heF9udW1iZXJfb2Zfc3ltYm9sc107CgliID0gbmV3IGNoYXJbbWF4X251bWJlcl9vZl9zeW1ib2xzXTsKCXZlY3RvciA8aW50PiBhX2RlY29tcG9zZWQoMTEsIDApOwoJdmVjdG9yIDxpbnQ+IGJfZGVjb21wb3NlZCgxMSwgMCk7CgkKCWNpbi5nZXRsaW5lKGEsIG1heF9udW1iZXJfb2Zfc3ltYm9scyk7CS8v0JLQstC+0LQg0LzQvdC+0LPQvtGH0LvQtdC90L7Qsi4KCWNpbi5nZXRsaW5lKGIsIG1heF9udW1iZXJfb2Zfc3ltYm9scyk7CglhX2RlY29tcG9zZWQgPSBkZWNvbXBvc2UoYSk7CgliX2RlY29tcG9zZWQgPSBkZWNvbXBvc2UoYik7CgkKCXZlY3RvciA8aW50PiBjX2RlY29tcG9zZWQgPSBtdWx0aXBsaWNhdGUoYV9kZWNvbXBvc2VkLCBiX2RlY29tcG9zZWQpOwoJY2hhciAqYzsKCWMgPSBuZXcgY2hhclttYXhfbnVtYmVyX29mX3N5bWJvbHNdOwoJY29tcG9zZShjLCBjX2RlY29tcG9zZWQpOwoJZXJhc2VfdGhlX3BsdXMoYyk7CS8v0KPQtNCw0LvRj9C10YLRgdGPINC/0LXRgNCy0YvQuSDQv9C70Y7RgSwg0LXRgdC70Lgg0L7QvSDQtdGB0YLRjC4KCWlmKHN0cmxlbihjKSA+IDApIGNvdXQgPDwgYzsKCWVsc2UgY291dCA8PCAwOwkJLy/QldGB0LvQuCDQsiDQvtGC0LLQtdGC0LUg0L/QvtC70YPRh9Cw0LXQvCDQutC+0L3RgdGC0LDQvdGC0YMgMC4KCXJldHVybiAwOwp9