// http://m...content-available-to-author-only...e.com/q/1258615/35416
#include <iostream>
#include <iomanip>
#include <vector>
#include <cstdlib>
std::vector<unsigned> bitsums { 0U, 0U, 0U };
std::vector<unsigned> countdown { 0U, 8U, 16U };
unsigned nextToFinish = 1;
void recurse(int xOffset, int yOffset, unsigned bitcount, unsigned maxExp) {
int xPow = 1, yPow = 0;
for (unsigned e = 0; e != maxExp; ++e) {
// invariant: xPow + i*yPow = (i - 1)^e
int x = xPow + xOffset, y = yPow + yOffset;
unsigned dist = std::max(std::abs(x), std::abs(y));
#if 0
static unsigned cnt = 0;
std::cout << ++cnt << ": (" << x << " = " << xPow << "+" << xOffset << ", "
<< y << " = " << yPow << "+" << yOffset << ") @ "
<< dist << " / " << bitcount << "\n";
#endif
while (countdown.size() <= dist) {
bitsums.push_back(0);
countdown.push_back(8 * countdown.size());
}
bitsums[dist] += bitcount;
if (--countdown[dist] == 0 && nextToFinish == dist) {
do {
bitsums[nextToFinish] += bitsums[nextToFinish - 1];
std::cout << std::setw(5) << nextToFinish << " "
<< std::setw(8) << bitsums[nextToFinish] << "\n";
if (nextToFinish == 250)
std::exit(0);
++nextToFinish;
} while (countdown[nextToFinish] == 0);
}
if (e)
recurse(x, y, bitcount + 1, e);
x = -(xPow + yPow);
yPow = xPow - yPow;
xPow = x;
}
}
int main(int argc, char** argv) {
recurse(0, 0, 1, -1);
}
Ly8gaHR0cDovL20uLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmUuY29tL3EvMTI1ODYxNS8zNTQxNgoKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGNzdGRsaWI+CgpzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gYml0c3VtcyB7IDBVLCAwVSwgMFUgfTsKc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IGNvdW50ZG93biB7IDBVLCA4VSwgMTZVIH07CnVuc2lnbmVkIG5leHRUb0ZpbmlzaCA9IDE7Cgp2b2lkIHJlY3Vyc2UoaW50IHhPZmZzZXQsIGludCB5T2Zmc2V0LCB1bnNpZ25lZCBiaXRjb3VudCwgdW5zaWduZWQgbWF4RXhwKSB7CiAgaW50IHhQb3cgPSAxLCB5UG93ID0gMDsKICBmb3IgKHVuc2lnbmVkIGUgPSAwOyBlICE9IG1heEV4cDsgKytlKSB7CiAgICAvLyBpbnZhcmlhbnQ6IHhQb3cgKyBpKnlQb3cgPSAoaSAtIDEpXmUKICAgIGludCB4ID0geFBvdyArIHhPZmZzZXQsIHkgPSB5UG93ICsgeU9mZnNldDsKICAgIHVuc2lnbmVkIGRpc3QgPSBzdGQ6Om1heChzdGQ6OmFicyh4KSwgc3RkOjphYnMoeSkpOwojaWYgMAogICAgc3RhdGljIHVuc2lnbmVkIGNudCA9IDA7CiAgICBzdGQ6OmNvdXQgPDwgKytjbnQgPDwgIjogKCIgPDwgeCA8PCAiID0gIiA8PCB4UG93IDw8ICIrIiA8PCB4T2Zmc2V0IDw8ICIsICIKICAgICAgICAgICAgICA8PCB5IDw8ICIgPSAiIDw8IHlQb3cgPDwgIisiIDw8IHlPZmZzZXQgPDwgIikgQCAiCiAgICAgICAgICAgICAgPDwgZGlzdCA8PCAiIC8gIiA8PCBiaXRjb3VudCA8PCAiXG4iOwojZW5kaWYKICAgIHdoaWxlIChjb3VudGRvd24uc2l6ZSgpIDw9IGRpc3QpIHsKICAgICAgYml0c3Vtcy5wdXNoX2JhY2soMCk7CiAgICAgIGNvdW50ZG93bi5wdXNoX2JhY2soOCAqIGNvdW50ZG93bi5zaXplKCkpOwogICAgfQogICAgYml0c3Vtc1tkaXN0XSArPSBiaXRjb3VudDsKICAgIGlmICgtLWNvdW50ZG93bltkaXN0XSA9PSAwICYmIG5leHRUb0ZpbmlzaCA9PSBkaXN0KSB7CiAgICAgIGRvIHsKICAgICAgICBiaXRzdW1zW25leHRUb0ZpbmlzaF0gKz0gYml0c3Vtc1tuZXh0VG9GaW5pc2ggLSAxXTsKICAgICAgICBzdGQ6OmNvdXQgPDwgc3RkOjpzZXR3KDUpIDw8IG5leHRUb0ZpbmlzaCA8PCAiICIKICAgICAgICAgICAgICAgICAgPDwgc3RkOjpzZXR3KDgpIDw8IGJpdHN1bXNbbmV4dFRvRmluaXNoXSA8PCAiXG4iOwogICAgICAgIGlmIChuZXh0VG9GaW5pc2ggPT0gMjUwKQogICAgICAgICAgc3RkOjpleGl0KDApOwogICAgICAgICsrbmV4dFRvRmluaXNoOwogICAgICB9IHdoaWxlIChjb3VudGRvd25bbmV4dFRvRmluaXNoXSA9PSAwKTsKICAgIH0KICAgIGlmIChlKQogICAgICByZWN1cnNlKHgsIHksIGJpdGNvdW50ICsgMSwgZSk7CiAgICB4ID0gLSh4UG93ICsgeVBvdyk7CiAgICB5UG93ID0geFBvdyAtIHlQb3c7CiAgICB4UG93ID0geDsKICB9Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewogIHJlY3Vyc2UoMCwgMCwgMSwgLTEpOwp9Cg==