#include #define ADD 1 #define DIV 2 #define DUP 3 #define MUL 4 #define SUB 5 struct element { int value; element *succ; }; class Stack { public: Stack() { first = NULL; n_elements = 0; } int GetCount() { return n_elements; } void Push( int value ) { element *new_el = new element; new_el->succ = first; new_el->value = value; first = new_el; n_elements++; } int Top() { return first->value; } int Pop() { int val; if( first == NULL ) return NULL; element *temp = first; first = first->succ; n_elements--; val = temp->value; delete temp; return val; } void Clear() { while( first ) Pop(); } private: element *first; int n_elements; }; Stack s; int begin[20], end[20], sequence[20]; int n, max, stack_el; int dup; int process() { int op1, op2, res; int i; for( i = 0; i <= max; i++ ) { if( sequence[i] == DUP ) { if( s.GetCount() < 1 ) return 0; res = s.Top(); s.Push( res ); } if( s.GetCount() < 2 ) return 0; if( sequence[i] == ADD ) { if( s.GetCount() < 2 ) return 0; op1 = s.Pop(); op2 = s.Pop(); if( op1 + op2 > 30000 || op1 + op2 < -30000 ) return 0; res = op1 + op2; s.Push( res ); } if( sequence[i] == SUB ) { op2 = s.Pop(); op1 = s.Pop(); if( op1 - op2 > 30000 || op1 - op2 < -30000 ) return 0; res = op1 - op2; s.Push( res ); } if( sequence[i] == MUL ) { op1 = s.Pop(); op2 = s.Pop(); if( op1 * op2 > 30000 || op1 * op2 < -30000 ) return 0; res = op1 * op2; s.Push( res ); } if( sequence[i] == DIV ) { op2 = s.Pop(); op1 = s.Pop(); if( op2 == 0 ) return 0; res = op1 / op2; s.Push( res ); } } return 1; } int test() { int i; s.Clear(); for( i = 0; i < n; i++ ) { s.Push( begin[i] ); if( process() == 0 ) return 0; if( s.GetCount() != 1 ) return 0; if( s.Pop() != end[i] ) return 0; } return 1; } int generate( int level ) { int i; if( dup > (max+1)/2 ) return 0; if( level > max ) return test(); if( level == 0 ) { sequence[0] = DUP; return generate( 1 ); } for( i = ADD; i <= SUB; i++ ) { if( i != DUP && stack_el < 2 ) continue; sequence[level] = i; if( i == DUP ) { stack_el++; dup++; } if( generate( level + 1 ) ) return 1; if( i == DUP ) { dup--; stack_el--; } } return 0; } void print() { int i; for( i = 0; i < max; i++ ) { if( sequence[i] == ADD ) printf("ADD "); if( sequence[i] == DIV ) printf("DIV "); if( sequence[i] == MUL ) printf("MUL "); if( sequence[i] == DUP ) printf("DUP "); if( sequence[i] == SUB ) printf("SUB "); } if( sequence[i] == ADD ) printf("ADD"); if( sequence[i] == DIV ) printf("DIV"); if( sequence[i] == MUL ) printf("MUL"); if( sequence[i] == DUP ) printf("DUP"); if( sequence[i] == SUB ) printf("SUB"); printf("\n\n"); } int main() { FILE *fp; fp = fopen("optimal.in", "r"); int i,j, k = 0; while( 1 ) { k++; fscanf( fp, " %d", &n ); if( n == 0 ) break; for(i = 0; i < n; i++ ) fscanf(fp," %d", &begin[i]); for(i = 0; i < n; i++ ) fscanf(fp," %d", &end[i]); for( i = 0; i < 20; i++ ) sequence[i] = 0; printf("Program %d\n", k); for( i = 0; i < n; i++ ) if( begin[i] != end[i] ) break; if( i == n ) { printf("Empty sequence\n\n"); continue; } for( max = 1; max < 10; max+= 2 ) { dup = 1; stack_el = 2; if( generate( 0 ) ) { print(); break; } } if( max >= 10 ) printf("Impossible\n\n"); } return 1; }