#include #include #include #define REP(i,a,b) for(i=a;i res) return; if(Magical + sumM[mask2] < 666-EPS) return; can = (int)((Magical+EPS) / X); rep(i,N) if(!(mask2&1< NextEffort) res = NextEffort; } continue; } rep(k,4){ if(minTimes[i]+k-1 > can) break; if(minTimes[i]+k-1 < 0) continue; NextEffort = Effort + C[i] * ipw[minTimes[i]+k-1]; NextMagical = Magical + M[i] * ipw[minTimes[i]+k-1] - (minTimes[i]+k-1)*X; if(NextMagical < Magical + EPS) break; if(target < NextMagical + EPS){ if(res > NextEffort) res = NextEffort; continue; } solve(NextEffort, NextMagical, mask+(1<<(2*i))*k, mask2+(1< sum+EPS){ puts("impossible"); continue; } fst = 0; k = 0; rep(i,N){ if(M[i]==0) continue; if(C[i]==0){ fst += M[i]; continue; } C[k] = C[i]; M[k] = M[i]; k++; } N = k; if(fst > target - EPS){ puts("0"); continue; } rep(i,N){ double tmp = M[i], use = 0; minTimes[i] = 0; while(tmp - use > target-EPS) tmp /= 3, use += X, minTimes[i]++; } rep(i,1<