#include #include #include #include #include #include #define MIN(a,b) (((a)<(b))?(a):(b)) #define MAX(a,b) (((a)>(b))?(a):(b)) #define SQR(x) ((x)*(x)) #ifdef DEBUG #define DBG(x) x #else #define DBG(x) #endif FILE *in; int n,i,c,len,kase=0; int y[16],p[16],pbest[16],bestlen; char cmd[8][4] = {"ADD", "DIV", "DUP", "MUL", "SUB"}; int st[16][16][16],stl[16][16]; int cmp (int *a,int *b,int n) { for (i=0 ; ib[i]) return 1; } return 0; } int backtrack (int pos) { int i,j,k,res; if (pos > 10 || pos >= bestlen) return -1; for (i=0 ; i1 || st[pos][i][0] != y[i]) break; if (i==n) { if (pos < bestlen || (pos == bestlen && cmp (p, pbest, pos) < 0)) { for (i=0 ; i 30000 || res < -30000) break; st[pos][i][stl[pos][i]-2] = res; stl[pos][i]--; } else if (j==4) { if (stl[pos][i]<2) break; res = st[pos][i][stl[pos][i]-2] - st[pos][i][stl[pos][i]-1]; if (res > 30000 || res < -30000) break; st[pos][i][stl[pos][i]-2] = res; stl[pos][i]--; } else if (j==3) { if (stl[pos][i]<2) break; res = st[pos][i][stl[pos][i]-2] * st[pos][i][stl[pos][i]-1]; if (res > 30000 || res < -30000) break; st[pos][i][stl[pos][i]-2] = res; stl[pos][i]--; } else if (j==1) { if (stl[pos][i]<2) break; if (st[pos][i][stl[pos][i]-1]==0) break; res = st[pos][i][stl[pos][i]-2] / st[pos][i][stl[pos][i]-1]; if (res > 30000 || res < -30000) break; st[pos][i][stl[pos][i]-2] = res; stl[pos][i]--; } else if (j==2) { if (stl[pos][i]<1) break; res = st[pos][i][stl[pos][i]-1]; if (res > 30000 || res < -30000) break; st[pos][i][stl[pos][i]++] = res; } } if (i==n) { backtrack (pos); } } return -1; } int main () { in = fopen ("optimal.in","r"); assert (in != NULL); while (1) { fscanf (in, " %d ", &n); if (n==0) break; printf ("Program %d\n", ++kase); for (i=0 ; i10) { printf ("Impossible\n"); } else if (bestlen==0) { printf ("Empty sequence\n"); } else { for (i=0 ; i