// Gokuri #include #include #include #include #include #include #include #include #include using namespace std; #define FNAME "optimal.txt" #define fin cin bool iter(int k, int n, vector >& stack, const vector& output, vector& answer) { vector > stack_back = stack; //cout << k << endl; const int size = output.size(); if (k > n) { return false; } // OK ? bool ok = true; for (int i= 0; i < output.size(); ++i) { if (abs(stack[i].back()) > 30000) { return false; } if (stack[i].size() != 1) { ok = false; break; } if (stack[i][0] != output[i]) { ok = false; break; } } if (ok) { return true; } // ADD ok = true; stack = stack_back; for (int i = 0; i < output.size(); ++i) { if (stack[i].size() == 1) { ok = false; break; } } if (ok) { for (int i = 0; i < size; ++i) { const int s = stack[i].size(); stack[i][s - 2] = stack[i][s - 1] + stack[i][s - 2]; stack[i].pop_back(); } //cout << "ADD"; if (iter(k + 1, n, stack, output, answer)) { answer.push_back("ADD"); return true; } } // DIV ok = true; stack = stack_back; for (int i = 0; i < output.size(); ++i) { if (stack[i].size() == 1) { ok = false; break; } if (stack[i][stack[i].size() - 1] == 0) { ok = false; break; } } if (ok) { for (int i = 0; i < size; ++i) { const int s = stack[i].size(); stack[i][s - 2] = stack[i][s - 2] / stack[i][s - 1]; stack[i].pop_back(); } //cout << "DIV"; if (iter(k + 1, n, stack, output, answer)) { answer.push_back("DIV"); return true; } } // DUP stack = stack_back; for (int i = 0; i < size; ++i) { const int s = stack[i].size(); stack[i].push_back(stack[i].back()); } //cout << "DUP"; if (iter(k + 1, n, stack, output, answer)) { answer.push_back("DUP"); return true; } // MUL ok = true; stack = stack_back; for (int i = 0; i < output.size(); ++i) { if (stack[i].size() == 1) { ok = false; break; } } if (ok) { for (int i = 0; i < size; ++i) { const int s = stack[i].size(); stack[i][s - 2] = stack[i][s - 2] * stack[i][s - 1]; stack[i].pop_back(); } //cout << "MUL"; if (iter(k + 1, n, stack, output, answer)) { answer.push_back("MUL"); return true; } } // SUB ok = true; stack = stack_back; for (int i = 0; i < output.size(); ++i) { if (stack[i].size() == 1) { ok = false; break; } } if (ok) { for (int i = 0; i < size; ++i) { const int s = stack[i].size(); stack[i][s - 2] = stack[i][s - 2] - stack[i][s - 1]; stack[i].pop_back(); } // cout << "SUB"; if (iter(k + 1, n, stack, output, answer)) { answer.push_back("SUB"); return true; } } return false; } void solve(int n, const vector& input, const vector& output) { vector > stack(input.size()); vector > stack_back(input.size()); vector answer; for (int i = 0; i < input.size(); ++i) { stack[i].push_back(input[i]); } stack_back = stack; cout << "Program " << n << endl; if (input == output) { cout << "Empty sequence" << endl << endl; return; } for (int i = 1; i <= 10; ++i) { // cout << "------------------------------" << endl; stack = stack_back; answer.clear(); if (iter(0, i, stack, output, answer)) { for (int j = answer.size() - 1; j >=0; --j) { cout << answer[j]; if (j) { cout << ' '; } } cout << endl << endl; return; } } cout << "Impossible" << endl << endl; } int main(void) { ifstream fin(FNAME); if (!fin) { return 1; } // INPUT HERE int N; int n = 0; while (cin >> N, N) { vector input(N); vector output(N); for (int i = 0; i < N; ++i) { cin >> input[i]; } for (int i = 0; i < N; ++i) { cin >> output[i]; } solve(++n, input, output); } return 0; }