#include #include #include #include #include #include #define D 1 #if D #define _V(_vna, _prf) printf("%s: %"#_prf" (L %d)\n", #_vna, _vna, __LINE__) #else #define _V(_, __) #endif int inp[12], outp[12], u; char prg[20]; int lae, dub; int mal; int test() { long stack[20]; int sl, i, j; if (lae != 2*dub) return 0; for (i = 0; i < u; i++) { sl = 1; stack[0] = inp[i]; for (j = 0; j < lae; j++) { if (sl < 1) return 0; if (sl < 2 && prg[j] != '2') return 0; switch (prg[j]) { case '2': stack[sl] = stack[sl - 1]; sl++; break; case '*': sl--; stack[sl-1] *= stack[sl]; break; case '/': sl--; if (!stack[sl]) return 0; stack[sl-1] /= stack[sl]; break; case '+': sl--; stack[sl-1] += stack[sl]; break; case '-': sl--; stack[sl-1] -= stack[sl]; break; } if (stack[sl-1] < -30000 || stack[sl-1] > 30000) return 0; } /* for j */ if (stack[0] != outp[i]) return 0; } return 1; } int rek() { /*_V(prg, s);*/ if (lae == mal) { if (test()) return 1; } else { lae++; prg[lae-1] = '+'; if (rek()) return 1; prg[lae-1] = '/'; if (rek()) return 1; prg[lae-1] = '2'; dub++; if (rek()) return 1; dub--; prg[lae-1] = '*'; if (rek()) return 1; prg[lae-1] = '-'; if (rek()) return 1; lae--; } return 0; } int main(C) { int i, j, gl, geht; FILE *f=fopen("optimal.in","r"); prg[18] = 0; while(fscanf(f,"%d", &u),u) { for (i = 0; i < u; i++) fscanf(f, "%d", &inp[i]); gl = 1; for (i = 0; i < u; i++) { fscanf(f, "%d", &outp[i]); if (outp[i] != inp[i]) gl = 0; } geht = 1; if (gl) lae = 0; else { prg[0] = '2'; lae = 1; dub = 1; geht = 0; for (mal = 2; mal <= 10; mal += 2) { if (geht = rek()) break; } } printf("Program %d\n", C++); if (geht) { if (gl) printf("Empty sequence\n\n"); else { for (i = 0; i < lae; i++) { if (i) printf(" "); printf(prg[i]=='2'?"DUP":prg[i]=='+'?"ADD":prg[i]=='-'?"SUB": prg[i]=='*'?"MUL":"DIV"); } printf("\n\n"); } } else printf("Impossible\n\n"); } return 0; }