#include <stdio.h>
#include <stdint.h>
using nint=uint64_t;
nint r(nint y){
if (y%3==0) //
return y/3;
//Максимальное bin(3*((1<<64)-1)) -> 101111111111111111111111111111111111111111111111111111111111111101
//Известны все биты, кроме 65 и 64, которые могут иметь значение или 10, или 01
// Если 10: 1<<65=36893488147419103232, остаток от деления на 3 равен 2
//(36893488147419103232+1)/3=12297829382473034411
if (y%3==1)
return (y-1)/3+12297829382473034411llu;
// Если 01: 1<<65=18446744073709551616, остаток от деления на 3 равен 1
//(18446744073709551616+2)/3=6148914691236517206
if (y%3==2)
return (y-2)/3+6148914691236517206llu;
};
nint f(nint x){
return x*3;
}
void test(nint i){
nint x,y;
x=r(i);
y=f(x);
if (i==y)
printf("%llu :> %020llu -> %llu\n",i,x,y);
else
printf("%llu :> %020llu -> %llu ERR\n",i,x,y);
}
int main()
{
for (nint i=0;i<10;i++)
test(i);
for (nint i=0;i<10;i++)
test(18446744073709551615llu-i);
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KCnVzaW5nIG5pbnQ9dWludDY0X3Q7CgoKbmludCByKG5pbnQgeSl7CglpZiAoeSUzPT0wKSAvLwoJCXJldHVybiB5LzM7CgoJLy/QnNCw0LrRgdC40LzQsNC70YzQvdC+0LUgYmluKDMqKCgxPDw2NCktMSkpIC0+IDEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMQoJLy/QmNC30LLQtdGB0YLQvdGLINCy0YHQtSDQsdC40YLRiywg0LrRgNC+0LzQtSA2NSDQuCA2NCwg0LrQvtGC0L7RgNGL0LUg0LzQvtCz0YPRgiDQuNC80LXRgtGMINC30L3QsNGH0LXQvdC40LUg0LjQu9C4IDEwLCDQuNC70LggMDEKCgkvLwnQldGB0LvQuCAxMDogMTw8NjU9MzY4OTM0ODgxNDc0MTkxMDMyMzIsINC+0YHRgtCw0YLQvtC6INC+0YIg0LTQtdC70LXQvdC40Y8g0L3QsCAzINGA0LDQstC10L0gMgoJLy8oMzY4OTM0ODgxNDc0MTkxMDMyMzIrMSkvMz0xMjI5NzgyOTM4MjQ3MzAzNDQxMQoJaWYgKHklMz09MSkKCQlyZXR1cm4gKHktMSkvMysxMjI5NzgyOTM4MjQ3MzAzNDQxMWxsdTsKCgkvLwnQldGB0LvQuCAwMTogMTw8NjU9MTg0NDY3NDQwNzM3MDk1NTE2MTYsINC+0YHRgtCw0YLQvtC6INC+0YIg0LTQtdC70LXQvdC40Y8g0L3QsCAzINGA0LDQstC10L0gMQoJLy8oMTg0NDY3NDQwNzM3MDk1NTE2MTYrMikvMz02MTQ4OTE0NjkxMjM2NTE3MjA2CglpZiAoeSUzPT0yKQoJCXJldHVybiAoeS0yKS8zKzYxNDg5MTQ2OTEyMzY1MTcyMDZsbHU7Cn07CgpuaW50IGYobmludCB4KXsKCXJldHVybiB4KjM7Cn0KCnZvaWQgdGVzdChuaW50IGkpewoJbmludCB4LHk7Cgl4PXIoaSk7Cgl5PWYoeCk7CglpZiAoaT09eSkKCQlwcmludGYoIiVsbHUgOj4gJTAyMGxsdSAtPiAlbGx1XG4iLGkseCx5KTsKCWVsc2UKCQlwcmludGYoIiVsbHUgOj4gJTAyMGxsdSAtPiAlbGx1ICBFUlJcbiIsaSx4LHkpOwp9CmludCBtYWluKCkKewoJZm9yIChuaW50IGk9MDtpPDEwO2krKykKCQl0ZXN0KGkpOwoKCWZvciAobmludCBpPTA7aTwxMDtpKyspCgkJdGVzdCgxODQ0Njc0NDA3MzcwOTU1MTYxNWxsdS1pKTsKCn0K