#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; } |
English