#include #include #include #include #include #define ERROR -100000 int prg [32], lprg; int ins[32], outs[32], ntest; /***** spusti program, ale musi byt regulerne utvoreny, co do zavorek *****/ /* vraci vysledek nebo ERROR */ int run (int in) { int st [32], t = 1; st[0] = in; for ( int i = 0; i < lprg; ++i ) { switch ( prg[i] ) { case 'A': --t; st[t-1] = st[t-1] + st[t]; break; case 'S': --t; st[t-1] = st[t-1] - st[t]; break; case 'M': --t; st[t-1] = st[t-1] * st[t]; break; case 'D': --t; if ( st[t] == 0 ) return ERROR; st[t-1] = st[t-1] / st[t]; break; default: st[t] = st[t-1]; ++t; break; } if ( t[st-1] < -30000 || t[st-1] > 30000 ) return ERROR; } return st[0]; } /***** vraci jednicku, kdyz program vyhovuje *****/ int check (void) { for ( int i = 0; i < ntest; ++i ) if ( run (ins[i]) != outs[i] ) return 0; return 1; } int tryit (int idx, int len, int br) { if ( br > len ) return 0; if ( len == 0 ) return check(); if ( br == 0 ) { prg[idx] = 'E'; return tryit (idx+1, len-1, 1); } prg[idx] = 'A'; if ( tryit (idx+1, len-1, br-1) ) return 1; prg[idx] = 'D'; if ( tryit (idx+1, len-1, br-1) ) return 1; prg[idx] = 'E'; if ( tryit (idx+1, len-1, br+1) ) return 1; prg[idx] = 'M'; if ( tryit (idx+1, len-1, br-1) ) return 1; prg[idx] = 'S'; return tryit (idx+1, len-1, br-1); } int main (void) { int prob = 0; FILE* fin = fopen ("optimal.in", "r"); for ( ; ; ) { fscanf (fin, "%d", &ntest); if ( ntest == 0 ) break; for ( int i = 0; i < ntest; ++i ) fscanf (fin, "%d", ins+i); for ( int i = 0; i < ntest; ++i ) fscanf (fin, "%d", outs+i); int ok = 0; for ( lprg = 0; lprg <= 10; ++lprg ) if ( tryit (0, lprg, 0) ) { ok = 1; break; } printf ("Program %d\n", ++prob); if ( ok ) { if ( lprg > 0 ) { for ( int i = 0; i < lprg; ++i ) { if ( i != 0 ) printf (" "); switch ( prg[i] ) { case 'A': printf ("ADD"); break; case 'S': printf ("SUB"); break; case 'M': printf ("MUL"); break; case 'D': printf ("DIV"); break; default: printf ("DUP"); } } printf ("\n\n"); } else printf ("Empty sequence\n\n"); } else printf ("Impossible\n\n"); } return 0; }