\\ v ... current value \\ f ... index of next digit to process (from array dig) explore(v, f) = { if (f > #dig, best = min(best, v); v*10^(#dig-f+1) < best, my (kd=0); for (t=f, #dig, kd=10*kd+dig[t]; if (kd==0, if (v%10, explore(v*10, t+1); ); break, fordiv (kd, d, if (d > 9, break, d != v%10, my (k=kd/d); \\ add k d's explore(v*10^k + (10^k-1)/9*d, t+1); ); ); ); ); ); } a(n) = { target = n; best = oo; dig = digits(n); explore(0, 1); return (best); } for (n=0, 10 000, print (n " " a(n))) quit