allocate mem(2^30) sub(n) = { my (b=binary(n), s=[]); for (i=1, #b, if (b[i], for (j=i, #b, s = setunion(s, [fromdigits(b[i..j],2)])))); s } cache = vector(819, n, sub(n)) b(n,k)=vecmax(setintersect(cache[n],cache[k])) a(n) = prod(k=1, n, b(n,k)) for (n=1, #cache, v=a(n); print (n " " a(n))) quit