magic

Time limit: 0.2s Memory limit: 64MB Input: magic.in Output: magic.out

Această problemă este interactivă. Comisia are o valoare pozitivă pe 1616 biți, necunoscută vouă. Această valoare va fi modificată conform următoarei reguli.

  1. Voi veți transmite succesiv valori pozitive pe 1616 biți folosind o funcție pusă la dispoziție de către comisie.
  2. Comisia va efectua operația sau exclusiv pe biți (cunoscută drept xor) între valoare furnizată de voi și acea valoare necunoscută.
  3. Asupra biților valorii obținute comisia va aplica o rotație circulară a biților cu un număr aleator între 00 și 1515 de poziții (o rotație de xx poziții înseamnă mutarea secvenței formate din ultimii xx biti de pe ultimele xx poziții pe primele xx poziții).

Astfel se va obține noua valoare necunoscută în locul vechii valorii.
Aceste reguli se vor aplica de cel mult 100 000100 \ 000 de ori. Dacă după un număr de aplicări a regulii valoarea necunoscută capătă valoarea 00 sunteți magici si obțineți puncte (foarte importante în viitor). Dacă nu, nu veți obține nimic.

Programul vostru va trebui să conțină o funcție

void play()

Această funcție trebuie să apeleze de cel mult 100 000100 \ 000 de ori funcția

int giveValue (int x)

Valoarea parametrului xx trebuie să fie egală exact cu valoarea pe care doriți să o transmiteți. Funcția giveValue este pusă la dispoziția voastră de către comisie și va returna 11 dacă ați ghicit numărul, 00 altfel.

Restricții și precizări

  • Funcția play va fi apelată de maxim 100100 de ori în cadrul unui test
  • Nu apelați funcția giveValue de mai mult de 100 000100\ 000 de ori în implementarea funcției play.
  • Numărul furnizat în funcția giveValue trebuie să se afle în intervalul [0,216)[0,2^{16})
  • Nu trebuie să implementați funcția main
  • Trebuie să includeți fișierul "magic.h"

Exemplu

Grader: play()
Concurent: giveValue(1)
Concurent: giveValue(2)
Concurent: giveValue(16)
Grader: Acordă punctaj!

Explicație

Valoarea secretă este 7=00000000000001117=0000000000000111.

Valoarea devine 71=6=00000000000001107\oplus 1=6=0000000000000110.
Valoarea devine 3=0000000000000113=000000000000011 după o rotație cu o poziție.

Valoarea devine 32=1=00000000000000013\oplus 2=1=0000000000000001.
Valoarea devine 16=000000000001000016=0000000000010000 după o rotație cu 1212 poziții.

Valoarea devine 1616=0=000000000000000016\oplus 16=0=0000000000000000.
Valoarea devine 0=00000000000000000=0000000000000000 după o rotație cu 99 poziții.

Valoarea necunoscută a fost transformată în 00 după 33 apeluri!

Log in or sign up to be able to send submissions!