Abans de plantejar aquest problema, us recordem (o informem) que:
Donats dos enters @a@ i @b@, en C++
(@a@^@b@) és el XOR d’@a@ i @b@.
És a dir, n’és el “or exclusiu bit a bit”: el resultat d’operar cada
parell de bits és 1 sii els dos bits són diferents. Per exemple,
(9^12)
(^)
5.
Donats dos enters @x@ i @n@, en C++
(@x@<<@n@) és el resultat
de desplaçar @x@ @n@ bits cap a l’esquerra. Si no hi ha sobreiximents,
dóna el resultat de multiplicar @x@ per 2 elevat a @n@. Per exemple,
(9<<2)
(<<2)
36.
Ara, el problema. L’Edgar ha descobert un nou algorisme de hashing al qual li veu un gran futur en aplicacions criptogràfiques. Semblant a tants altres métodes, combina moltes operacions de bits, per la qual cosa podria ser complicat recuperar la informació original.
L’Edgar ha decidit que treballarà amb enters de bits (és a dir, módul ). Donats dos enters i , defineix:
((^)<<0)
^
((^)<<1)
^ … ^
((^)<<(B-1))
) %(1<<B)
L’Edgar ens assegura (i té raó) que donats i , només hi ha una possible. Ell creu que el seu mètode és prou segur, és a dir, que no es pot obtenir eficientment a partir d’ i de . Demostreu que l’Edgar és un palomo.
L’entrada consisteix en diversos casos, cadascun amb i , dos enters entre 0 i .
Per a cada cas, escriviu la corresponent.
Input
23 42 100 20 0 0 123 456 1000000000 987654321 1073741823 1073741822
Output
105 88 0 547 888697811 1073741821