From Catalin Francu C++ source code that generates A005228. Runs in (approx.) O( n + sqrt(n) + sqrt(sqrt(n)) + sqrt(sqrt(sqrt(n)))...) to generate the first n elements. Tested up to n = 1,000,000,000. Input is n, output is a(n). Needs quasi-constant memory. %o A005228 #include typedef unsigned long long uint64; typedef struct { uint64 value; uint64 inc; } pair; pair series[100]; void init_all_series() { pair initial_pair = { 7, 5 }; // pregenerate the first three terms for (int i = 0; i < 99; series[i++] = initial_pair); } void generate(int k); inline bool test(int k, unsigned number) { switch (number) { case 1: case 3: case 7: return 1; case 2: case 4: case 5: case 6: return 0; default: while (series[k].value < number) generate(k); return (series[k].value == number); } } inline void generate(int k) { series[k].value += series[k].inc; if (test(k+1, ++series[k].inc)) series[k].inc++; } int main(void) { int x; init_all_series(); scanf("%d", &x); // Enter the index switch (x) { case 1: puts("1"); break; case 2: puts("3"); break; default: for (int k = 4; k <= x; k++) generate(0); printf("%llu ", series[0].value); // print the x'th term } return 0; }