#include #include #include #include #include using namespace std; #define BASE 3 long long rev(long long v) { long long r = 0; while (v) { r = BASE*r + v%BASE; v /= BASE; } return r; } vector pal; map palindex; long long upal = 0; bool ispal(long long v) { while (upal <= v) { if (rev(upal)==upal) { palindex[upal] = pal.size(); pal.push_back(upal); } upal++; } return palindex.count(v)>0; } // make sure pal[n] exists void ensure(long long n) { while (n>=pal.size()) { ispal(upal+1000000); } } #define MAX 100000000 bool seen[MAX]; long long unseen = 1; long long sum = 0; long long other() { long long u = palindex[sum]; long long v = palindex[sum]; // both directions u-- .. v++ while (u>=0) { ensure(v); long long pu = pal[u]; long long pv = pal[v]; long long du = sum-pu; long long dv = pv-sum; long long d = (du=MAX) { fprintf(stderr, "# the end\n"); exit(0); } if (!seen[d]) { if ((d%2==1) && d==dv) { sum = pv; return d; } else if ((d%2==0) && d==du) { sum = pu; return d; } } if (d==du) { u--; } if (d==dv) { v++; } } // single direction v++ while (true) { ensure(v); long long pv = pal[v]; long long d = pv-sum; if (d>=MAX) { fprintf(stderr, "# the end\n"); exit(0); } if (!seen[d]) { if ((d%2)==1) { sum = pv; return d; } } v++; } } int main() { memset(seen, 0, sizeof(seen)); seen[0] = true; for (long long n=1; n<=50000; n++) { long long v=other(); seen[v] = true; while (seen[unseen]) { unseen++; } printf("%lld %lld\n", n, v); fflush(stdout); } return 0; }