#include #include #include using namespace std; union long2int { long long ll; int i[2]; }; long long encode(const int x, const int y) { long2int l2i; l2i.i[0] = x; l2i.i[1] = y; return l2i.ll; } void decode(const long long ll, int &x, int &y) { long2int l2i; l2i.ll = ll; x = l2i.i[0]; y = l2i.i[1]; } // visited states #define MAXX 500 #define MAXY 500000 unordered_set farAway; bool near[1+2*MAXX][1+2*MAXY]; bool visited(long long pos) { int v,x; decode(pos, v,x); if (v>=-MAXX && v<=MAXX && x>=-MAXY && x<=MAXY) { return near[v+MAXX][x+MAXY]; } else { return farAway.count(pos); } } void visit(long long pos) { int v,x; decode(pos, v,x); if (v>=-MAXX && v<=MAXX && x>=-MAXY && x<=MAXY) { near[v+MAXX][x+MAXY] = true; } else { farAway.insert(pos); } } // go backwards to unsivited states void backwards(long long pos, unordered_set &positions) { int v, x; decode(pos, v, x); for (int d=-1; d<=+1; d++) { long long b = encode(v+d, x-v); if (!visited(b)) { positions.insert(b); } } } int main() { memset(near, 0, sizeof(near)); // positions at distance n unordered_set w; w.insert(0); for (int n=0; n<=1000; n++) { // set everything as seen for (long long pos : w) { visit(pos); } { long long nb = 0; for (long long pos : w) { int v,x; decode(pos, v,x); if (v>=0 && x>=0) { nb++; } } cout << n << ' ' << nb << endl; } // go backwards unordered_set before; for (long long pos : w) { backwards(pos, before); } w = before; } theEnd: return 0; }