Hashing astut? P78794


Statement
 

pdf   zip

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) == (100121001_2^110021100_2) =01012== 0101_2 = 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) == (100121001_2<<2)=1001002== 100100_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 B=30B = 30 bits (és a dir, módul 2B2^B). Donats dos enters aa i bb, defineix:

h(a,b)=(h(a, b) = \big( ((aa^bb)<<0) ^ ((aa^bb)<<1) ^^ ((aa^bb)<<(B-1)) ) %(1<<B)

L’Edgar ens assegura (i té raó) que donats aa i c=h(a,b)c = h(a, b), només hi ha una bb possible. Ell creu que el seu mètode és prou segur, és a dir, que no es pot obtenir bb eficientment a partir d’aa i de cc. Demostreu que l’Edgar és un palomo.

Entrada

L’entrada consisteix en diversos casos, cadascun amb aa i cc, dos enters entre 0 i 23012^{30} - 1.

Sortida

Per a cada cas, escriviu la bb corresponent.

Public test cases
  • Input

    23 42
    100 20
    0 0
    123 456
    1000000000 987654321
    1073741823 1073741822
    

    Output

    105
    88
    0
    547
    888697811
    1073741821
    
  • Information
    Author
    Izan Beltrán
    Language
    Catalan
    Official solutions
    C++
    User solutions
    C++