|
PROG
|
(Python)
def make_reachable(coefficients, factorials, max_k):
reachable = set([0])
for factorial in factorials:
reachable_extra = set(r + coefficient * factorial for r in reachable for coefficient in coefficients if r + coefficient * factorial <= max_k)
reachable.update(reachable_extra)
return reachable
def generate_sequence_elements(num_elements):
m = [0]
factorials = [1]
k = 1
max_k = 1
reachable = make_reachable(m, factorials, max_k)
while len(m) < num_elements:
if k > max_k:
max_k *= 2
reachable = make_reachable(m, factorials, max_k)
if factorials[-1] * (len(factorials) + 1) <= k:
factorials.append(factorials[-1] * (len(factorials) + 1))
reachable = make_reachable(m, factorials, max_k)
if k not in reachable:
m.append(k)
reachable = make_reachable(m, factorials, max_k)
k += 1
return m
print(generate_sequence_elements(20)) # Sidney Cadot, Mar 01 2023
(PARI)
Fact(lim)={my(k=1); while(k!<=lim, k++); vector(k-1, i, i!)}
Scan(lim, F, S)=my(b=2^lim); for(i=1, #F, my(f=F[i], t=0); for(j=1, #S, my(s=f*S[j]); if(s && s<=lim, t=bitor(t, b>>s))); b=bitor(b, t)); b=2^(lim+1)-1-b; if(!b, 0, lim-logint(b, 2))
upto(lim) = {my(S=[0], t=0, b=0); while(t || b<lim, if(t, S=concat(S, t), b=min(lim, 2*b+1)); t=Scan(b, Fact(b), S)); S}
|