import java.util.* ;
class Main
{
static int strToInt
( String s,
int begin,
int end
) { //Принимает строку и индексы первого и последнего символов, между которыми в ней (предположительно) записано число (последний не включительно). int val = 0 ; //Возвращает объект типа int, значение которого равно этому числу.
boolean negative = false ; //Является ли число отрицательным?
if ( s.charAt ( begin) == '+' ) begin++; //Плюс игнорируется.
else {
if ( s.charAt ( begin) == '-' ) { //Проверка на отрицательность.
negative = true ;
begin++;
}
}
for ( int i = begin; i < end; ++ i) { //Обработка самих цифр числа.
val *= 10 ;
val += s.charAt ( i) - 48 ;
}
if ( val == 0 && s.charAt ( begin) != '0' ) val++; //Если значение получилось равным нулю, но в исходной строке не только ноль, значит, обрабатывается строка вида "+x", в которой при записи опускается единица
if ( negative == true ) val *= - 1 ;
return val;
}
static String intToStr
( int val
) { //Возвращает строку с записанным в ней числом val. if ( val > 0 ) s = s + "+" ; //Проверка на отрицательность.
else {
val *= - 1 ;
s = s + "-" ;
}
while ( val > 0 ) {
tmp
= tmp
+ Integer .
toString ( val
% 10
) ; //В tmp хранится запись числа в обратном порядке. val /= 10 ;
}
for ( int i = tmp.length ( ) - 1 ; i >= 0 ; -- i) { //Переписывание элементво из tmp в s в верном порядке.
s = s + tmp.charAt ( i) ;
}
return s;
}
static String eraseThePlus
( String s
) { //Удаляет плюс, стоящий в начале строки. if ( s.charAt ( 0 ) == '+' ) s = s.substring ( 1 , s.length ( ) ) ;
return s;
}
static String eraseTheOne
( String s
) { //Удаляет единицу из строк вида "+1x", "-1x^y". if ( ( s.charAt ( 1 ) == '1' ) && ( s.length ( ) == 2 ) ) s = s.charAt ( 0 ) + s.substring ( 2 , s.length ( ) ) ;
return s;
}
static void analyze
( String s,
Vector v
) { //Анализирует строку и увеличивает соответствующие элементы вектора на коэфициенты при степенях х. for ( int i = 0 ; i < 11 ; ++ i) v.addElement ( 0 ) ;
if ( s.indexOf ( 'x' ) == - 1 ) v.set ( 0 , ( int ) ( v.elementAt ( 0 ) ) + strToInt( s, 0 , s.length ( ) ) ) ;
else {
if ( s.indexOf ( '^' ) == - 1 ) v.set ( 1 , ( int ) ( v.elementAt ( 1 ) ) + strToInt( s, 0 , s.indexOf ( "x" ) ) ) ; //Строка вида "ax".
else {
int power = strToInt( s, s.indexOf ( "^" ) + 1 , s.length ( ) ) ; //Строка вида "ax^y".
v.set ( power, ( int ) ( v.elementAt ( power) ) + strToInt( s, 0 , s.indexOf ( "x" ) ) ) ;
}
}
}
static Vector decompose
( String s
) { //Разбивает многочлен на слогаемые и возвращает вектор, индексы элементов которого соответствуют степеням х, а сами элементы - коэффициентам при них. int i = 0 ;
while ( i < s.length ( ) ) {
cur_s = "" ;
cur_s = cur_s + s.charAt ( i) ;
i++;
while ( ( i < s.length ( ) ) && ( s.charAt ( i) != '+' ) && ( s.charAt ( i) != '-' ) ) { //cur_s - анализируемое в данный момент слогаемое.
cur_s = cur_s + s.charAt ( i) ;
i++;
}
analyze( cur_s, v) ;
}
return v;
}
Vector c
= new Vector ( ) ; //Возвращает вектор, индексы элементов которого соответствуют степеням х, а сами элементы - коэффициентам при них. for ( int i = 0 ; i < 21 ; ++ i) c.addElement ( 0 ) ;
for ( int i = 0 ; i < 11 ; ++ i) {
for ( int j = 0 ; j < 11 ; ++ j) {
c.set ( i+ j, ( ( int ) ( c.elementAt ( i+ j) ) ) + ( ( int ) ( a.elementAt ( i) ) ) * ( ( int ) ( b.elementAt ( j) ) ) ) ;
}
}
return c;
}
static String compose
( Vector v
) { //Из элементов вектора составляет строку, в которой записан многочлен. for ( int i = v.size ( ) - 1 ; i >= 2 ; -- i) {
if ( ( int ) v.elementAt ( i) != 0 ) {
String coef
= intToStr
( ( int ) v.
elementAt ( i
) ) ; //Коэффициент. coef = eraseTheOne( coef) ;
s = s + coef;
s = s + "x" ;
s = s + "^" ;
String power
= intToStr
( i
) ; //Степень х. power = eraseThePlus( power) ;
s = s + power;
}
}
if ( ( int ) v.elementAt ( 1 ) != 0 ) { //Записи слогаемых с первой и нулевой степенями х отличаются.
String coef
= intToStr
( ( int ) v.
elementAt ( 1 ) ) ; coef = eraseTheOne( coef) ;
s = s + coef;
s = s + "x" ;
}
if ( ( int ) v.elementAt ( 0 ) != 0 ) {
s = s + intToStr( ( int ) v.elementAt ( 0 ) ) ;
}
return s;
}
{
Scanner in
= new Scanner
( System .
in ) ; a_decomposed = decompose( a) ;
b_decomposed = decompose( b) ;
Vector c_decomposed
= multiplicate
( a_decomposed, b_decomposed
) ; c = compose( c_decomposed) ;
if ( c.length ( ) > 0 ) {
c = eraseThePlus( c) ; //Удаляется первый плюс, если он есть.
}
else System .
out .
print ( 0 ) ; //Если в ответе получаем константу 0. }
}
aW1wb3J0IGphdmEudXRpbC4qOwoKY2xhc3MgTWFpbgp7CglzdGF0aWMgaW50IHN0clRvSW50KFN0cmluZyBzLCBpbnQgYmVnaW4sIGludCBlbmQpeyAvL9Cf0YDQuNC90LjQvNCw0LXRgiDRgdGC0YDQvtC60YMg0Lgg0LjQvdC00LXQutGB0Ysg0L/QtdGA0LLQvtCz0L4g0Lgg0L/QvtGB0LvQtdC00L3QtdCz0L4g0YHQuNC80LLQvtC70L7Qsiwg0LzQtdC20LTRgyDQutC+0YLQvtGA0YvQvNC4INCyINC90LXQuSAo0L/RgNC10LTQv9C+0LvQvtC20LjRgtC10LvRjNC90L4pINC30LDQv9C40YHQsNC90L4g0YfQuNGB0LvQviAo0L/QvtGB0LvQtdC00L3QuNC5INC90LUg0LLQutC70Y7Rh9C40YLQtdC70YzQvdC+KS4KCQlpbnQgdmFsID0gMDsJICAgICAgIC8v0JLQvtC30LLRgNCw0YnQsNC10YIg0L7QsdGK0LXQutGCINGC0LjQv9CwIGludCwg0LfQvdCw0YfQtdC90LjQtSDQutC+0YLQvtGA0L7Qs9C+INGA0LDQstC90L4g0Y3RgtC+0LzRgyDRh9C40YHQu9GDLgoJCWJvb2xlYW4gbmVnYXRpdmUgPSBmYWxzZTsgICAgICAvL9Cv0LLQu9GP0LXRgtGB0Y8g0LvQuCDRh9C40YHQu9C+INC+0YLRgNC40YbQsNGC0LXQu9GM0L3Ri9C8PwoJCWlmKHMuY2hhckF0KGJlZ2luKSA9PSAnKycpIGJlZ2luKys7Ly/Qn9C70Y7RgSDQuNCz0L3QvtGA0LjRgNGD0LXRgtGB0Y8uCgkJZWxzZXsKCQkJaWYocy5jaGFyQXQoYmVnaW4pID09ICctJyl7ICAgLy/Qn9GA0L7QstC10YDQutCwINC90LAg0L7RgtGA0LjRhtCw0YLQtdC70YzQvdC+0YHRgtGMLgoJCQkJbmVnYXRpdmUgPSB0cnVlOwoJCQkJYmVnaW4rKzsKCQkJfQoJCX0KCQlmb3IoaW50IGkgPSBiZWdpbjsgaSA8IGVuZDsgKytpKXsgIC8v0J7QsdGA0LDQsdC+0YLQutCwINGB0LDQvNC40YUg0YbQuNGE0YAg0YfQuNGB0LvQsC4KCQkJdmFsICo9IDEwOwoJCQl2YWwgKz0gcy5jaGFyQXQoaSkgLSA0ODsKCQl9CgkJaWYodmFsID09IDAgJiYgcy5jaGFyQXQoYmVnaW4pICE9ICcwJykgdmFsKys7IC8v0JXRgdC70Lgg0LfQvdCw0YfQtdC90LjQtSDQv9C+0LvRg9GH0LjQu9C+0YHRjCDRgNCw0LLQvdGL0Lwg0L3Rg9C70Y4sINC90L4g0LIg0LjRgdGF0L7QtNC90L7QuSDRgdGC0YDQvtC60LUg0L3QtSDRgtC+0LvRjNC60L4g0L3QvtC70YwsINC30L3QsNGH0LjRgiwg0L7QsdGA0LDQsdCw0YLRi9Cy0LDQtdGC0YHRjyDRgdGC0YDQvtC60LAg0LLQuNC00LAgIit4Iiwg0LIg0LrQvtGC0L7RgNC+0Lkg0L/RgNC4INC30LDQv9C40YHQuCDQvtC/0YPRgdC60LDQtdGC0YHRjyDQtdC00LjQvdC40YbQsAoJCWlmKG5lZ2F0aXZlID09IHRydWUpIHZhbCAqPSAtMTsKCQlyZXR1cm4gdmFsOwoJfQoJCglzdGF0aWMgU3RyaW5nIGludFRvU3RyKGludCB2YWwpeyAvL9CS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0YLRgNC+0LrRgyDRgSDQt9Cw0L/QuNGB0LDQvdC90YvQvCDQsiDQvdC10Lkg0YfQuNGB0LvQvtC8IHZhbC4KCQlTdHJpbmcgcyA9ICIiLCB0bXAgPSAiIjsKCQlpZih2YWwgPiAwKSBzID0gcyArICIrIjsgLy/Qn9GA0L7QstC10YDQutCwINC90LAg0L7RgtGA0LjRhtCw0YLQtdC70YzQvdC+0YHRgtGMLgoJCWVsc2V7CgkJCXZhbCAqPSAtMTsKCQkJcyA9IHMgKyAiLSI7CgkJfQoJCXdoaWxlKHZhbCA+IDApewoJCQl0bXAgPSB0bXAgKyBJbnRlZ2VyLnRvU3RyaW5nKHZhbCUxMCk7IC8v0JIgdG1wINGF0YDQsNC90LjRgtGB0Y8g0LfQsNC/0LjRgdGMINGH0LjRgdC70LAg0LIg0L7QsdGA0LDRgtC90L7QvCDQv9C+0YDRj9C00LrQtS4KCQkJdmFsIC89IDEwOwoJCX0KCQlmb3IoaW50IGkgPSB0bXAubGVuZ3RoKCktMTsgaSA+PSAwOyAtLWkpeyAvL9Cf0LXRgNC10L/QuNGB0YvQstCw0L3QuNC1INGN0LvQtdC80LXQvdGC0LLQviDQuNC3IHRtcCDQsiBzINCyINCy0LXRgNC90L7QvCDQv9C+0YDRj9C00LrQtS4KCQkJcyA9IHMgKyB0bXAuY2hhckF0KGkpOwoJCX0KCQlyZXR1cm4gczsKCX0KCglzdGF0aWMgU3RyaW5nIGVyYXNlVGhlUGx1cyhTdHJpbmcgcyl7ICAvL9Cj0LTQsNC70Y/QtdGCINC/0LvRjtGBLCDRgdGC0L7Rj9GJ0LjQuSDQsiDQvdCw0YfQsNC70LUg0YHRgtGA0L7QutC4LgoJCWlmKHMuY2hhckF0KDApID09ICcrJykgcyA9IHMuc3Vic3RyaW5nKDEsIHMubGVuZ3RoKCkpOwoJCXJldHVybiBzOwoJCn0KIAoJc3RhdGljIFN0cmluZyBlcmFzZVRoZU9uZShTdHJpbmcgcyl7ICAgLy/Qo9C00LDQu9GP0LXRgiDQtdC00LjQvdC40YbRgyDQuNC3INGB0YLRgNC+0Log0LLQuNC00LAgIisxeCIsICItMXheeSIuCgkJaWYoKHMuY2hhckF0KDEpID09ICcxJykgJiYgKHMubGVuZ3RoKCkgPT0gMikpIHMgPSBzLmNoYXJBdCgwKSArIHMuc3Vic3RyaW5nKDIsIHMubGVuZ3RoKCkpOwoJCXJldHVybiBzOwoJfQoKCXN0YXRpYyB2b2lkIGFuYWx5emUoU3RyaW5nIHMsIFZlY3RvciB2KXsgIC8v0JDQvdCw0LvQuNC30LjRgNGD0LXRgiDRgdGC0YDQvtC60YMg0Lgg0YPQstC10LvQuNGH0LjQstCw0LXRgiDRgdC+0L7RgtCy0LXRgtGB0YLQstGD0Y7RidC40LUg0Y3Qu9C10LzQtdC90YLRiyDQstC10LrRgtC+0YDQsCDQvdCwINC60L7RjdGE0LjRhtC40LXQvdGC0Ysg0L/RgNC4INGB0YLQtdC/0LXQvdGP0YUg0YUuCgkJZm9yKGludCBpID0gMDsgaSA8IDExOyArK2kpIHYuYWRkRWxlbWVudCgwKTsKCQlpZihzLmluZGV4T2YoJ3gnKSA9PSAtMSkgdi5zZXQoMCwgKGludCkodi5lbGVtZW50QXQoMCkpICsgc3RyVG9JbnQocywgMCwgcy5sZW5ndGgoKSkpOyAKCQllbHNlewoJCQlpZihzLmluZGV4T2YoJ14nKSA9PSAtMSkgdi5zZXQoMSwgKGludCkodi5lbGVtZW50QXQoMSkpICsgc3RyVG9JbnQocywgMCwgcy5pbmRleE9mKCJ4IikpKTsgIC8v0KHRgtGA0L7QutCwINCy0LjQtNCwICJheCIuCgkJCWVsc2V7CgkJCQlpbnQgcG93ZXIgPSBzdHJUb0ludChzLCBzLmluZGV4T2YoIl4iKSArIDEsIHMubGVuZ3RoKCkpOyAvL9Ch0YLRgNC+0LrQsCDQstC40LTQsCAiYXheeSIuCgkJCQl2LnNldChwb3dlciwgKGludCkodi5lbGVtZW50QXQocG93ZXIpKSArIHN0clRvSW50KHMsIDAsIHMuaW5kZXhPZigieCIpKSk7CgkJCX0KCQl9Cgl9CgkKCXN0YXRpYyBWZWN0b3IgZGVjb21wb3NlKFN0cmluZyBzKXsgLy/QoNCw0LfQsdC40LLQsNC10YIg0LzQvdC+0LPQvtGH0LvQtdC9INC90LAg0YHQu9C+0LPQsNC10LzRi9C1INC4INCy0L7Qt9Cy0YDQsNGJ0LDQtdGCINCy0LXQutGC0L7RgCwg0LjQvdC00LXQutGB0Ysg0Y3Qu9C10LzQtdC90YLQvtCyINC60L7RgtC+0YDQvtCz0L4g0YHQvtC+0YLQstC10YLRgdGC0LLRg9GO0YIg0YHRgtC10L/QtdC90Y/QvCDRhSwg0LAg0YHQsNC80Lgg0Y3Qu9C10LzQtdC90YLRiyAtINC60L7RjdGE0YTQuNGG0LjQtdC90YLQsNC8INC/0YDQuCDQvdC40YUuCgkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7CgkJU3RyaW5nIGN1cl9zID0gIiI7CgkJaW50IGkgPSAwOwoJCXdoaWxlKGkgPCBzLmxlbmd0aCgpKXsKCQkJY3VyX3MgID0gIiI7CgkJCWN1cl9zID0gY3VyX3MgKyBzLmNoYXJBdChpKTsKCQkJaSsrOwoJCQl3aGlsZSgoaSA8IHMubGVuZ3RoKCkpICYmIChzLmNoYXJBdChpKSAhPSAnKycpICYmIChzLmNoYXJBdChpKSAhPSAnLScpKXsgLy9jdXJfcyAtINCw0L3QsNC70LjQt9C40YDRg9C10LzQvtC1INCyINC00LDQvdC90YvQuSDQvNC+0LzQtdC90YIg0YHQu9C+0LPQsNC10LzQvtC1LgoJCQkJY3VyX3MgPSBjdXJfcyArIHMuY2hhckF0KGkpOwoJCQkJaSsrOwoJCQl9CgkJCWFuYWx5emUoY3VyX3MsIHYpOwoJCX0KCQlyZXR1cm4gdjsKCX0KCglzdGF0aWMgVmVjdG9yIG11bHRpcGxpY2F0ZSAoVmVjdG9yIGEsIFZlY3RvciBiKXsgLy/Qo9C80L3QvtC20LXQvdC40LUg0LzQvdC+0LPQvtGH0LvQtdC90L7Qsi4KCQlWZWN0b3IgYyA9IG5ldyBWZWN0b3IoKTsgICAgICAgICAgICAgLy/QktC+0LfQstGA0LDRidCw0LXRgiDQstC10LrRgtC+0YAsINC40L3QtNC10LrRgdGLINGN0LvQtdC80LXQvdGC0L7QsiDQutC+0YLQvtGA0L7Qs9C+INGB0L7QvtGC0LLQtdGC0YHRgtCy0YPRjtGCINGB0YLQtdC/0LXQvdGP0Lwg0YUsINCwINGB0LDQvNC4INGN0LvQtdC80LXQvdGC0YsgLSDQutC+0Y3RhNGE0LjRhtC40LXQvdGC0LDQvCDQv9GA0Lgg0L3QuNGFLgoJCWZvcihpbnQgaSA9IDA7IGkgPCAyMTsgKytpKSBjLmFkZEVsZW1lbnQoMCk7CgkJZm9yKGludCBpID0gMDsgaSA8IDExOyArK2kpewoJCQlmb3IoaW50IGogPSAwOyBqIDwgMTE7ICsrail7CgkJCQljLnNldChpK2osICgoaW50KShjLmVsZW1lbnRBdChpK2opKSkrKChpbnQpKGEuZWxlbWVudEF0KGkpKSkqKChpbnQpKGIuZWxlbWVudEF0KGopKSkpOwoJCQl9CgkJfQoJCXJldHVybiBjOwoJfQoKCXN0YXRpYyBTdHJpbmcgY29tcG9zZShWZWN0b3Igdil7IC8v0JjQtyDRjdC70LXQvNC10L3RgtC+0LIg0LLQtdC60YLQvtGA0LAg0YHQvtGB0YLQsNCy0LvRj9C10YIg0YHRgtGA0L7QutGDLCDQsiDQutC+0YLQvtGA0L7QuSDQt9Cw0L/QuNGB0LDQvSDQvNC90L7Qs9C+0YfQu9C10L0uCgkJU3RyaW5nIHMgPSAiIjsKCQlmb3IoaW50IGkgPSB2LnNpemUoKSAtIDE7IGkgPj0gMjsgLS1pKXsKCQkJaWYoKGludCl2LmVsZW1lbnRBdChpKSAhPSAwKXsKCQkJCVN0cmluZyBjb2VmID0gaW50VG9TdHIoKGludCl2LmVsZW1lbnRBdChpKSk7IC8v0JrQvtGN0YTRhNC40YbQuNC10L3Rgi4KCQkJCWNvZWYgPSBlcmFzZVRoZU9uZShjb2VmKTsKCQkJCXMgPSBzICsgY29lZjsKCQkJCXMgPSBzICsgIngiOwoJCQkJcyA9IHMgKyAiXiI7CgkJCQlTdHJpbmcgcG93ZXIgPSBpbnRUb1N0cihpKTsgIC8v0KHRgtC10L/QtdC90Ywg0YUuCgkJCQlwb3dlciA9IGVyYXNlVGhlUGx1cyhwb3dlcik7CgkJCQlzID0gcyArIHBvd2VyOwoJCQl9CgkJfQoJCWlmKChpbnQpdi5lbGVtZW50QXQoMSkgIT0gMCl7ICAgLy/Ql9Cw0L/QuNGB0Lgg0YHQu9C+0LPQsNC10LzRi9GFINGBINC/0LXRgNCy0L7QuSDQuCDQvdGD0LvQtdCy0L7QuSDRgdGC0LXQv9C10L3Rj9C80Lgg0YUg0L7RgtC70LjRh9Cw0Y7RgtGB0Y8uCgkJCVN0cmluZyBjb2VmID0gaW50VG9TdHIoKGludCl2LmVsZW1lbnRBdCgxKSk7CgkJCWNvZWYgPSBlcmFzZVRoZU9uZShjb2VmKTsKCQkJcyA9IHMgKyBjb2VmOwoJCQlzID0gcyArICJ4IjsKCQl9CgkJaWYoKGludCl2LmVsZW1lbnRBdCgwKSAhPSAwKXsKCQkJcyA9IHMgKyBpbnRUb1N0cigoaW50KXYuZWxlbWVudEF0KDApKTsKCQl9CgkJcmV0dXJuIHM7Cgl9CgoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCgl7CgkJU2Nhbm5lciBpbiA9IG5ldyBTY2FubmVyKFN5c3RlbS5pbik7CgkJU3RyaW5nIGEgPSBpbi5uZXh0TGluZSgpOwoJCVN0cmluZyBiID0gaW4ubmV4dExpbmUoKTsKCQlTdHJpbmcgYyA9IG5ldyBTdHJpbmcoKTsKCQlWZWN0b3IgYV9kZWNvbXBvc2VkID0gbmV3IFZlY3RvcigxMSk7CgkJVmVjdG9yIGJfZGVjb21wb3NlZCA9IG5ldyBWZWN0b3IoMTEpOwoJCWFfZGVjb21wb3NlZCA9IGRlY29tcG9zZShhKTsKCQliX2RlY29tcG9zZWQgPSBkZWNvbXBvc2UoYik7CgkJVmVjdG9yIGNfZGVjb21wb3NlZCA9IG11bHRpcGxpY2F0ZShhX2RlY29tcG9zZWQsIGJfZGVjb21wb3NlZCk7CgkJYyA9IGNvbXBvc2UoY19kZWNvbXBvc2VkKTsKCQlpZihjLmxlbmd0aCgpID4gMCl7CgkJCWMgPSBlcmFzZVRoZVBsdXMoYyk7IC8v0KPQtNCw0LvRj9C10YLRgdGPINC/0LXRgNCy0YvQuSDQv9C70Y7RgSwg0LXRgdC70Lgg0L7QvSDQtdGB0YLRjC4KCQkJU3lzdGVtLm91dC5wcmludChjKTsKCQl9CgkJZWxzZSBTeXN0ZW0ub3V0LnByaW50KDApOyAvL9CV0YHQu9C4INCyINC+0YLQstC10YLQtSDQv9C+0LvRg9GH0LDQtdC8INC60L7QvdGB0YLQsNC90YLRgyAwLgoJfQp9