explore(n, s) = { my (p=1); forstep (k=n, 1, -1, p *= k; if (best < s+p && issquare(s+p), best = s+p; ); if (s+p+(k-1)! > best, explore (k-1, s+p); ); ); } a(n) = { best = 0; explore(n, 0); return (sqrtint(best)); } for (n=1, 39, print (n " " a(n))) quit