#define NDEBUG #include<bits/stdc++.h> using namespace std; #define REP(I,N) for(int I=0;I<(N);I++) #define FOR(I,A,B) for(int I=(A);I<=(B);I++) #define FI first #define SE second #define LIM 50000 #define LIM2 50 #define DEB 1 template<class T> inline string stringify(const T &x,int p=9){ostringstream o;o.precision(p);o<<x;o.flush();return o.str();} unordered_map<int,string> m; unordered_map<int,int> m2; inline void gen(int n){ int mode=0,mode2=0; string s; s.reserve(300); int d=(int)sqrt(n); int r=n-d*d; int r2=r; int q1=m2[d]<<1; if(r){ q1+=m2[r]; } int q2; if((d+1)*d<=n){ r=n-(d+1)*d; q2=m2[d]+m2[d+1]; if(r){ q2+=m2[r]; } if(q2<q1){ q1=q2; mode=1; r2=r; } } FOR(i,1,LIM2){ int dx=d-i; if(dx<=1) break; int dx2=n/dx; r=n-dx*dx2; q2=m2[dx]+m2[dx2]; if(r){ q2+=m2[r]; } if(q2<q1){ q1=q2; mode=7; mode2=i; r2=r; } } if(mode==0){ s="("+m[d]+"*"+m[d]; if(r2){ s+="+"+m[r2]; } s+=")"; }else if(mode==1){ s="("+m[d]+"*"+m[d+1]; if(r2){ s+="+"+m[r2]; } s+=")"; }else if(mode==7){ s="("+m[d-mode2]+"*"+m[n/(d-mode2)]; if(r2){ s+="+"+m[r2]; } s+=")"; } m[n]=s; m2[n]=q1; } inline string get(int n){ auto it=m.find(n); if(it!=m.end()) return m[n]; gen(n); return m[n]; } int main(){ m.reserve(LIM+10+100); m2.reserve(LIM+10+100); m[1]="1"; m2[1]=1; m[2]="(1+1)"; m2[2]=2; m[3]="(1+1+1)"; m2[3]=3; m[4]="(1+1+1+1)"; m2[4]=4; m[5]="(1+1+1+1+1)"; m2[5]=5; m[6]="((1+1)*(1+1+1))"; m2[6]=5; m[7]="((1+1)*(1+1+1)+1)"; m2[7]=6; m[8]="((1+1)*(1+1+1)+1+1)"; m2[8]=7; m[9]="((1+1+1)*(1+1+1))"; m2[9]=6; m[10]="((1+1)*(1+1+1+1+1))"; m2[10]=7; FOR(i,11,LIM){ gen(i); } int TT,x; cin>>TT; REP(i,TT){ cin>>x; cout<<get(x)<<"\n"; } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | #define NDEBUG #include<bits/stdc++.h> using namespace std; #define REP(I,N) for(int I=0;I<(N);I++) #define FOR(I,A,B) for(int I=(A);I<=(B);I++) #define FI first #define SE second #define LIM 50000 #define LIM2 50 #define DEB 1 template<class T> inline string stringify(const T &x,int p=9){ostringstream o;o.precision(p);o<<x;o.flush();return o.str();} unordered_map<int,string> m; unordered_map<int,int> m2; inline void gen(int n){ int mode=0,mode2=0; string s; s.reserve(300); int d=(int)sqrt(n); int r=n-d*d; int r2=r; int q1=m2[d]<<1; if(r){ q1+=m2[r]; } int q2; if((d+1)*d<=n){ r=n-(d+1)*d; q2=m2[d]+m2[d+1]; if(r){ q2+=m2[r]; } if(q2<q1){ q1=q2; mode=1; r2=r; } } FOR(i,1,LIM2){ int dx=d-i; if(dx<=1) break; int dx2=n/dx; r=n-dx*dx2; q2=m2[dx]+m2[dx2]; if(r){ q2+=m2[r]; } if(q2<q1){ q1=q2; mode=7; mode2=i; r2=r; } } if(mode==0){ s="("+m[d]+"*"+m[d]; if(r2){ s+="+"+m[r2]; } s+=")"; }else if(mode==1){ s="("+m[d]+"*"+m[d+1]; if(r2){ s+="+"+m[r2]; } s+=")"; }else if(mode==7){ s="("+m[d-mode2]+"*"+m[n/(d-mode2)]; if(r2){ s+="+"+m[r2]; } s+=")"; } m[n]=s; m2[n]=q1; } inline string get(int n){ auto it=m.find(n); if(it!=m.end()) return m[n]; gen(n); return m[n]; } int main(){ m.reserve(LIM+10+100); m2.reserve(LIM+10+100); m[1]="1"; m2[1]=1; m[2]="(1+1)"; m2[2]=2; m[3]="(1+1+1)"; m2[3]=3; m[4]="(1+1+1+1)"; m2[4]=4; m[5]="(1+1+1+1+1)"; m2[5]=5; m[6]="((1+1)*(1+1+1))"; m2[6]=5; m[7]="((1+1)*(1+1+1)+1)"; m2[7]=6; m[8]="((1+1)*(1+1+1)+1+1)"; m2[8]=7; m[9]="((1+1+1)*(1+1+1))"; m2[9]=6; m[10]="((1+1)*(1+1+1+1+1))"; m2[10]=7; FOR(i,11,LIM){ gen(i); } int TT,x; cin>>TT; REP(i,TT){ cin>>x; cout<<get(x)<<"\n"; } return 0; } |