#include #include #include #include #include #include #include #include using namespace std; map tmp; set > ans[1010]; int a[1010],b[1010],c[1010]; bool cmp(vector > A,vector > B) { vector >::reverse_iterator pA=A.rbegin(),pB=B.rbegin(); while (1) { if (pA->firstfirst) return true; if (pA->first>pB->first) return false; if (abs(pA->second)second)) return true; if (abs(pA->second)>abs(pB->second)) return false; if (pA->secondsecond) return true; if (pA->second>pB->second) return false; ++pA;++pB; } } void init() { tmp[1]=1; tmp[0]=-1; ans[1].insert(tmp); for (int i=2;i<=1001;++i) { for (int j=1;j >::iterator p=ans[j].begin();p!=ans[j].end();++p) ans[i].insert(*p); for (int j=0;j<=i;++j) a[j]=0; a[i]=1; a[0]=-1; for (set >::iterator p=ans[i].begin();p!=ans[i].end();++p) { for (int j=0;j<=i;++j) b[j]=c[j]=0; for (std::_Rb_tree_const_iterator > it=p->begin();it!=p->end();++it) b[it->first]=it->second; int get=0; for (int j=0;j<=i;++j) if (b[j]) get=j; for (int j=i;j>=0;--j) if (a[j]) { c[j-get]=a[j]; for (int k=get;k>=0;--k) a[j-get+k]-=c[j-get]*b[k]; } for (int j=i;j>=0;--j) a[j]=c[j]; } tmp.clear(); for (int j=i;j>=0;--j) if (a[j]) tmp[j]=a[j]; ans[i].insert(tmp); } } void work() { while (1) { int n; scanf("%d",&n); if (!n) return; vector > > v; v.clear(); vector > w; for (set >::iterator p=ans[n].begin();p!=ans[n].end();++p) { w.clear(); for (std::_Rb_tree_const_iterator > it=p->begin();it!=p->end();++it) w.push_back(make_pair(it->first,it->second)); v.push_back(w); } sort(v.begin(),v.end(),cmp); for (vector > >::iterator p=v.begin();p!=v.end();++p) { w=*p; putchar('('); int flag=0; for (vector >::reverse_iterator it=w.rbegin();it!=w.rend();++it) { if (flag) putchar((it->second>0)?'+':'-'); it->second=abs(it->second); if (it->first==0) printf("%d",it->second); else if (it->first==1) (it->second==1)?putchar('x'):printf("%dx",it->second); else (it->second==1)?printf("x^%d",it->first):printf("%dx^%d",it->second,it->first); flag=1; } putchar(')'); } puts(""); } } int main() { init(); work(); return 0; }