#include #include #include #include long long first [10]; // d0* long long current[10]; // d.* long long last [10]; // d9* #define CYCLE 16 long long digit [CYCLE]; // first digit as 2^d (cyclic) long long view [CYCLE]; // first digit long long started = 0; // mask of pending digits int main() { for (int d=0; d<=9; d++) { first[d] = current[d] = last[d] = d; } memset(digit, 0, sizeof(digit)); int k = 0; for (long long n=1;; n++) { if (started==0) { if (k) { printf("\n"); fflush(stdout); } if (k==1000) { break; } printf("%lld ", ++k); } if (digit[n % CYCLE]==0) { long long vv = LLONG_MAX; long long bb = 0; long long dd = 0; for (int d=1, b=1; d<=9; d++,b*=2) { if ((started & b)==0 && !digit[(n+1+d)%CYCLE]) { if (vv > current[d]) { vv = current[d]; dd = d; bb = b; } } } if (dd) { started += digit[(n+1+dd)%CYCLE] = bb; view[n%CYCLE] = view[(n+1+dd)%CYCLE] = dd; // consume 2 numbers for (int c=0; c<=1; c++) { if (current[dd]==last[dd]) { current[dd] = first[dd] = 10 * first[dd]; last[dd] = 10 * last[dd] + 9; } else { current[dd]++; } } } else { fprintf(stderr, "# the end\n"); exit(1); } } else { // second term of a pair started -= digit[n % CYCLE]; digit[n % CYCLE] = 0; } printf ("%lld", view[n % CYCLE]); } return 0; }