#P3948. Common Polynomial

Common Polynomial

描述

数学老师松平先生正在向学生们教授多项式的展开和因式分解。上周,他布置了一项作业,要求学生们写出两个多项式(关于单变量xx),并计算它们的最大公因式(GCM)。但他发现手动检查学生的答案很枯燥,因此请你编写一个程序来检查这些答案。

以下仅考虑系数为整数的多项式,即整系数多项式。

当给定两个整系数多项式AABB时,如果存在整系数多项式XXYY,使得A=CXA = CXB=CYB = CY,则整系数多项式CCAABB的公因式。

两个整系数多项式的GCM是次数最高的公因式(关于xx)。你需要编写一个程序来计算两个多项式的GCM。

已知当忽略常数乘法因子时,给定的两个多项式的GCM是唯一的。也就是说,如果CCDD都是两个多项式AABB的GCM,则存在非零整数ppqq,使得p×C=q×Dp \times C = q \times D

输入

输入由多个数据集组成。每个数据集由两行输入组成,每行表示一个多项式,其格式如下:

  • 基本元素(primary)是变量xx、数字序列090-9或用括号括起来的表达式。例如:xx9999(x+1)(x+1)
  • 因子(factor)是基本元素本身,或后跟指数的基本元素。指数由符号^后跟数字序列090-9组成。例如:x05x^051151^15(x+1)3(x+1)^3
  • 项(term)由一个或多个相邻的因子组成。例如:4x4x(x+1)(x2)(x+1)(x-2)3(x+1)23(x+1)^2
  • 表达式(expression)由一个或多个由++-连接的项组成。此外,表达式的第一项可以可选地以减号-开头。例如:x+1-x+13(x+1)2x(x1)23(x+1)^2-x(x-1)^2

整数常数、指数、乘法(相邻因子)、加法(++)和减法/取负(-)具有它们通常的含义。数字序列始终被解释为整数常数。例如,9999表示9999,而不是9×99 \times 9

输入的任何子表达式在完全展开和标准化后,系数小于100100xx的次数小于1010。指数中的数字序列表示非零值。

所有数据集的设计都确保使用32位二进制补码整数的标准算法可以解决该问题而不会溢出。

输入的结束由一行包含一个句点表示。

输出

对于每个数据集,在一行中输出GCM多项式表达式,格式如下:

c0xp0±c1xp1±cnxpnc_0x^{p_0} \pm c_1x^{p_1} \ldots \pm c_nx^{p_n}

其中cic_ipip_ii=0,,ni = 0, \ldots, n)是正整数,且p0>p1>>pnp_0 > p_1 > \ldots > p_n,并且{cii=0,,n}\{c_i | i = 0, \ldots, n\}的最大公约数为1。

此外:

  • cic_i等于1时,除非对应的pip_i为0,否则应省略cic_i
  • x0x^0应整体省略。
  • x1x^1应写为xx

输入数据 1

-(x^3-3x^2+3x-1)
(x-1)^2
x^2+10x+25
x^2+6x+5
x^3+1
x-1
.

输出数据 1

x^2-2x+1
x+5
1