#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);

}
