#include <stdio.h>
//convert (x,y) to d
int xy2d (int n, int x, int y) {
int rx, ry, s, d=0;
for (s=n/2; s>0; s/=2) {
rx = (x & s) > 0;
ry = (y & s) > 0;
d += s * s * ((3 * rx) ^ ry);
rot(s, &x, &y, rx, ry);
}
return d;
}
//convert d to (x,y)
void d2xy(int n, int d, int *x, int *y) {
int rx, ry, s, t=d;
*x = *y = 0;
for (s=1; s<n; s*=2) {
rx = 1 & (t/2);
ry = 1 & (t ^ rx);
rot(s, x, y, rx, ry);
*x += s * rx;
*y += s * ry;
t /= 4;
}
}
//rotate/flip a quadrant appropriately
void rot(int n, int *x, int *y, int rx, int ry) {
if (ry == 0) {
if (rx == 1) {
*x = n-1 - *x;
*y = n-1 - *y;
}
//Swap x and y
int t = *x;
*x = *y;
*y = t;
}
}
int main(void) {
int x = 0;
int y = 0;
d2xy(1000, 228, &x, &y);
}
I2luY2x1ZGUgPHN0ZGlvLmg+Ci8vY29udmVydCAoeCx5KSB0byBkCmludCB4eTJkIChpbnQgbiwgaW50IHgsIGludCB5KSB7CiAgICBpbnQgcngsIHJ5LCBzLCBkPTA7CiAgICBmb3IgKHM9bi8yOyBzPjA7IHMvPTIpIHsKICAgICAgICByeCA9ICh4ICYgcykgPiAwOwogICAgICAgIHJ5ID0gKHkgJiBzKSA+IDA7CiAgICAgICAgZCArPSBzICogcyAqICgoMyAqIHJ4KSBeIHJ5KTsKICAgICAgICByb3QocywgJngsICZ5LCByeCwgcnkpOwogICAgfQogICAgcmV0dXJuIGQ7Cn0KIAovL2NvbnZlcnQgZCB0byAoeCx5KQp2b2lkIGQyeHkoaW50IG4sIGludCBkLCBpbnQgKngsIGludCAqeSkgewogICAgaW50IHJ4LCByeSwgcywgdD1kOwogICAgKnggPSAqeSA9IDA7CiAgICBmb3IgKHM9MTsgczxuOyBzKj0yKSB7CiAgICAgICAgcnggPSAxICYgKHQvMik7CiAgICAgICAgcnkgPSAxICYgKHQgXiByeCk7CiAgICAgICAgcm90KHMsIHgsIHksIHJ4LCByeSk7CiAgICAgICAgKnggKz0gcyAqIHJ4OwogICAgICAgICp5ICs9IHMgKiByeTsKICAgICAgICB0IC89IDQ7CiAgICB9Cn0KIAovL3JvdGF0ZS9mbGlwIGEgcXVhZHJhbnQgYXBwcm9wcmlhdGVseQp2b2lkIHJvdChpbnQgbiwgaW50ICp4LCBpbnQgKnksIGludCByeCwgaW50IHJ5KSB7CiAgICBpZiAocnkgPT0gMCkgewogICAgICAgIGlmIChyeCA9PSAxKSB7CiAgICAgICAgICAgICp4ID0gbi0xIC0gKng7CiAgICAgICAgICAgICp5ID0gbi0xIC0gKnk7CiAgICAgICAgfQogCiAgICAgICAgLy9Td2FwIHggYW5kIHkKICAgICAgICBpbnQgdCAgPSAqeDsKICAgICAgICAqeCA9ICp5OwogICAgICAgICp5ID0gdDsKICAgIH0KfQppbnQgbWFpbih2b2lkKSB7CglpbnQgeCA9IDA7CglpbnQgeSA9IDA7CglkMnh5KDEwMDAsIDIyOCwgJngsICZ5KTsKCXByaW50ZigiJWQgJWQiLCB4LHkpOwp9Cg==