C, 478 바이트
#define R return
bs(x,v,l,h,r)unsigned x,*v,l,h,*r;{unsigned m;for(;l<=h;){m=(l+h)/2;if(x<v[m])h=m-1;else if(x>v[m])l=m+1;else{*r=m;R 1;}}*r=m;R 0;}
#include<stdlib.h>
unsigned*f(unsigned w){unsigned*u=0,i,k,m,y,z;if(w>1E6||w==0)R u;u=malloc(w*sizeof*u);if(!u)R u;k=0;u[k++]=1;if(w==1)R u;m=u[k++]=2;if(w==2)R u;l:for(i=0,y=0,z=k-1,++m;i<k;y+=bs(m-u[i],u,i+1,z,&z),++i)if(y>1||u[i]+(i+1!=k?u[i+1]:0)>m)break;if(m==0){free(u);u=0;R u;}if(y!=1)goto l;u[k++]=m;if(k< w)goto l;R u;}
Tio에서는 9 초 만에 10000 개의 값을 찾을 수 있습니다 (처음에는 100 개의 값이 인쇄됩니다). 트릭은 내부 루프에서 선형 검색을 사용하지 않고 이진 검색을 사용하고 있습니다 ...이 함수는 잘 들여 쓰기되고 완전히 읽을 수있는 기능입니다 (마침내 나를 위해).
bsCopy(x,v,l,h,r)unsigned x,*v,l,h,*r;
{unsigned m;
for(;l<=h;){m=(l+h)/2;if(x<v[m])h=m-1;else if(x>v[m])l=m+1;else{*r=m;R 1;}}
*r=m;R 0;// in *r if return 0 the min index that fail else the index of find x
}
unsigned*fCopy(unsigned w)
{unsigned*u=0,i,k,m,y,z;
if(w>1E6||w==0)R u;
u=malloc(w*sizeof*u);
if(!u)R u;
k=0;u[k++]=1;if(w==1)R u;
m=u[k++]=2;if(w==2)R u;//below I suppose m-u[i] is in the range (if exist in u) (i+1)..z
l: for(i=0,y=0,z=k-1,++m;i<k;y+=bsCopy(m-u[i],u,i+1,z,&z),++i)
if(y>1||u[i]+(i+1!=k?u[i+1]:0)>m)break;
if(m==0){free(u);u=0;R u;}
if(y!=1)goto l;
u[k++]=m;if(k< w)goto l;
R u;
}