fork(1) download
  1. #include <stdio.h>
  2. #include <stdint.h>
  3.  
  4. using nint=uint64_t;
  5.  
  6.  
  7. nint r(nint y){
  8. if (y%3==0) //
  9. return y/3;
  10.  
  11. //Максимальное bin(3*((1<<64)-1)) -> 101111111111111111111111111111111111111111111111111111111111111101
  12. //Известны все биты, кроме 65 и 64, которые могут иметь значение или 10, или 01
  13.  
  14. // Если 10: 1<<65=36893488147419103232, остаток от деления на 3 равен 2
  15. //(36893488147419103232+1)/3=12297829382473034411
  16. if (y%3==1)
  17. return (y-1)/3+12297829382473034411llu;
  18.  
  19. // Если 01: 1<<65=18446744073709551616, остаток от деления на 3 равен 1
  20. //(18446744073709551616+2)/3=6148914691236517206
  21. if (y%3==2)
  22. return (y-2)/3+6148914691236517206llu;
  23. };
  24.  
  25. nint f(nint x){
  26. return x*3;
  27. }
  28.  
  29. void test(nint i){
  30. nint x,y;
  31. x=r(i);
  32. y=f(x);
  33. if (i==y)
  34. printf("%llu :> %020llu -> %llu\n",i,x,y);
  35. else
  36. printf("%llu :> %020llu -> %llu ERR\n",i,x,y);
  37. }
  38. int main()
  39. {
  40. for (nint i=0;i<10;i++)
  41. test(i);
  42.  
  43. for (nint i=0;i<10;i++)
  44. test(18446744073709551615llu-i);
  45.  
  46. }
  47.  
Success #stdin #stdout 0s 4268KB
stdin
Standard input is empty
stdout
0 :> 00000000000000000000 -> 0
1 :> 12297829382473034411 -> 1
2 :> 06148914691236517206 -> 2
3 :> 00000000000000000001 -> 3
4 :> 12297829382473034412 -> 4
5 :> 06148914691236517207 -> 5
6 :> 00000000000000000002 -> 6
7 :> 12297829382473034413 -> 7
8 :> 06148914691236517208 -> 8
9 :> 00000000000000000003 -> 9
18446744073709551615 :> 06148914691236517205 -> 18446744073709551615
18446744073709551614 :> 12297829382473034410 -> 18446744073709551614
18446744073709551613 :> 18446744073709551615 -> 18446744073709551613
18446744073709551612 :> 06148914691236517204 -> 18446744073709551612
18446744073709551611 :> 12297829382473034409 -> 18446744073709551611
18446744073709551610 :> 18446744073709551614 -> 18446744073709551610
18446744073709551609 :> 06148914691236517203 -> 18446744073709551609
18446744073709551608 :> 12297829382473034408 -> 18446744073709551608
18446744073709551607 :> 18446744073709551613 -> 18446744073709551607
18446744073709551606 :> 06148914691236517202 -> 18446744073709551606