#include int in[15]; int f[15]; int C[15]; int ndup, nusa; int NumIn; int S[100],NumS; int sol[100], minl, found; int Eval(int x,int l) { int i; NumS = 0; S[NumS++] = x; for (i=0; i < l ; i++) { switch(C[i]) { int a,b; case 0: a = S[--NumS]; b = S[--NumS]; S[NumS++] = a+b; break; case 1: a = S[--NumS]; b = S[--NumS]; if (!a) return 0; S[NumS++] = b/a; break; case 2: a = S[--NumS]; S[NumS++] = a; S[NumS++] = a; break; case 3: a = S[--NumS]; b = S[--NumS]; S[NumS++] = a*b; break; case 4: a = S[--NumS]; b = S[--NumS]; S[NumS++] = b-a; break; default: break; } if (S[NumS-1] > 30000 || S[NumS-1] < -30000) return 66666; } return S[NumS-1]; } int check(int l) { int i; for (i=0; i < NumIn; i++) if (f[i] != Eval(in[i],l)) return 0; return 1; } int cerca(int l) { int i; if(nusa==ndup) { if(check(l)) { if(!found) { for(i=0;i sol[i]) { ok=0; break; } } if(ok) { for(i=0;i 0) printf(" "); if (sol[i] == 0) printf("ADD"); if (sol[i] == 1) printf("DIV"); if (sol[i] == 2) printf("DUP"); if (sol[i] == 3) printf("MUL"); if (sol[i] == 4) printf("SUB"); } puts("\n"); break; } else { puts("Impossible\n"); } } return 0; }