// 2008アジア地区予選I : Common Polynomial #include #include #include using namespace std; int gcd(int a, int b){ return a%b ? gcd(b, a%b) : b; } int lcm(int a, int b){ return a/gcd(a,b)*b; } vector mul(vector a, vector b){ vector res(a.size()+b.size()-1, 0); for(int i=0;i pow(vector vi, int p){ vector res(1,1); for(int i=0;i add(vector a, vector b){ vector res(max(a.size(), b.size()), 0); for(int i=0;i parseExpr(string&, int&); vector parseFact(string &str, int &idx){ vector res(1, 0); if(isdigit(str[idx])){ res[0] = getDigit(str,idx); } else if(str[idx]=='x') { res.push_back(1); idx++; } else if(str[idx]=='('){ idx++; res = parseExpr(str, idx); idx++; } if(idx < str.size() && str[idx]=='^'){ idx++; res = pow(res, getDigit(str, idx)); } return res; } vector parseTerm(string &str, int &idx){ vector res(1, 1); while(idx < str.size() && str[idx]!='-' && str[idx]!='+' && str[idx]!=')') res = mul(res, parseFact(str, idx)); return res; } vector parseExpr(string &str, int &idx){ vector res(1, 0); while(idx < str.size() && str[idx]!=')'){ bool m = (str[idx]=='-'); if(str[idx]=='-'||str[idx]=='+') idx++; vector vi = parseTerm(str, idx); if(m) for(int i=0;i &vi){ while(!vi.empty() && vi.back() == 0) vi.pop_back(); if(vi.empty()) return ; int g = vi.back(); for(int i=0;i vi){ for(int i=vi.size()-1;i>=0;i--){ if(vi[i]==0) continue; if(i==0||abs(vi[i])>1){ if(i==vi.size()-1) printf("%d", vi[i]); else printf("%+d", vi[i]); } else if(i!=vi.size()-1){ if(vi[i]>0) printf("+"); else printf("-"); } if(i > 0) printf("x"); if(i > 1) printf("^%d", i); } puts(""); } vector gcm(vector a, vector b){ while(true){ normalize(a); normalize(b); if(a.empty()) break; int L = lcm(a.back(), b.back()); if(a.size() < b.size()) swap(a, b); a = mul(a, vector(1, L/a.back())); b = mul(b, vector(1, L/b.back())); for(int idxA = a.size()-1,idxB = b.size()-1;idxA>=0 && idxB>=0;idxA--,idxB--) a[idxA] -= b[idxB]; } return b; } int main(){ ifstream fin("I.in"); string str; while(fin >> str){ if(str == ".") break; int idx = 0; vector a = parseExpr(str, idx); fin >> str; idx = 0; vector b = parseExpr(str, idx); print(gcm(a, b)); } }