#include static const uint64_t divtab[244] = { [1] = 0xffffffff + 1l, [3] = 0x55555555 + 1l, [9] = 0x1c71c71c + 1l, [27] = 0x097b425e + 1l, [81] = 0x0329161f + 1l, [243] = 0x010db20a + 1l }; #define FASTDIV(n, C) (((n) * (C)) >> 32) #define FASTMOD(n, d, C) ((n) - (d) * FASTDIV((n), (C))) int new(int i, int x, int y) { uint64_t A, B, C; A = FASTDIV(i, divtab[y]); B = FASTMOD(A, 3, divtab[3]); C = FASTMOD(A + (uint64_t)x, 3, divtab[3]); return i + (C - B) * y; }