ConcursC++17

coduri

Întorcându-se de la şcoală în ziua în care a aflat cum se face înmulţirea numerelor, Gigel a auzit la televizor următoarea afirmaţie: „Pentru a face avere, nu trebuie să aduni bani în viaţă, ci trebuie să-i înmulţeşti”.

Toate acestea l-au pus pe gânduri, aşa că s-a hotărât să inventeze propriul „sistem de codificare” pentru numere reale mai mari decât 00 care să aibă următoarele proprietăţi:

  • fiecare număr va fi codificat sub forma unui şir de valori întregi (pozitive şi/ sau negative)
  • dacă un număr real xx are codul cxc_x şi un număr real yy are codul cyc_y , atunci numărul real rezultat prin înmulţirea lui xx şi yy trebuie să aibă codul obţinut prin „adunarea” codurilor cxc_x şi cyc_y
  • dacă un număr real xx se poate scrie ca produs de numere y1,y2,…,yky_1, y_2, \ldots , y_k, atunci codul lui xx se obţine prin „adunarea” codurilor numerelor y1,y2,…,yky_1, y_2, \ldots , y_k
  • Considerăm un cod c1c_1 format din n1n_1 valori an1…a1a_{n_1} \ldots a_1 şi un cod c2c_2 format din n2n_2 valori bn2…b1b_{n_2} \ldots b_1 , atunci codul c3c_3 obţinut prin „adunarea” codurilor c1c_1 şi c2c_2 va avea n3n_3 valori dn3…d1d_{n_3} \ldots d_1, cu proprietăţile următoare:
    • n3n_3 este maximul dintre n1n_1 şi n2n_2
    • di={ai+bi,pentru i=1,…,minim(n1,n2)ai,pentru i=minim(n1,n2)+1,…n1,daca˘ minim(n1,n2)=n2bi,pentru i=minim(n1,n2)+1,…n2,daca˘ minim(n1,n2)=n1d_i = \begin{cases} a_i + b_i, &\text{pentru } i = 1, \ldots, minim(n_1,n_2) \\ a_i, &\text{pentru } i = minim(n_1,n_2) + 1, \ldots n_1, &\text{dacă } minim(n_1, n_2)=n_2\\ b_i, &\text{pentru } i = minim(n_1,n_2) + 1, \ldots n_2, &\text{dacă } minim(n_1, n_2)=n_1 \end{cases}

Cerință

Dându-se NN numere reale mai mari strict decât 00, să se scrie codificarea acestora în sistemul inventat de Gigel.

Date de intrare

Fişierul de ieşire coduri.in va conţine:

  • pe prima linie din fişier se află numărul NN de numere reale
  • pe următoarele NN linii cele NN numere reale, fiecare pe câte o linie

Date de ieșire

Fişierul de ieşire coduri.out va conţine NN linii:

Pe linia ii (ii între 11 şi NN) : numărul de valori folosite pentru codificarea numărului cu indicele ii din fişierul de intrare, urmat de un spaţiu şi apoi valorile ce alcătuiesc codul numărului, separate două câte două printr-un singur spaţiu.

Restricții și precizări

  • 2≤N≤182 \leq N \leq 18
  • Separatorul între partea întreagă şi partea zecimală este virgula
  • Orice număr are după virgulă cel mult 55 cifre
  • Valorile din codurile numerelor din fişierele de test trebuie să fie cuprinse în intervalul [−106,106][-10^6, 10^6]
  • Partea întreagă a fiecărui număr real este o valoare mai mică sau egală cu 20 00020 \ 000
  • Toate numerele din fişierele de test sunt strict pozitive şi distincte două câte două
  • Numărul maxim de valori utilizat pentru codificarea unui număr este 2 5002 \ 500
  • Dacă există mai multe soluţii de codificare, se va afişa una singură
  • Nu trebuie să existe două numere diferite cu aceeaşi codificare
  • 40%40\% din teste vor conţine numai numere întregi, 30%30\% din teste vor conţine numere întregi şi numere reale fără perioadă şi 30%30\% din teste vor conţine numere întregi şi numere reale cu şi fără perioadă

Exemplu

coduri.in

8
10
2
5
0,3
7
2,1
1,(7)
1,2(34)

coduri.out

2 1 1
3 -1 0 1
3 1 1 0
3 2 1 0
3 -1 2 1
3 1 3 1
2 1 11
2 1 2

Explicație

10=2⋅510=2 \cdot 5, iar suma codurilor pentru 22 şi 55, determină codul lui 1010

2,1=7⋅0,32,1=7 \cdot 0,3, iar suma codurilor pentru 77 şi 0,30,3 determină codul lui 2,12,1

Sursă și autori

ONI 2007, clasele 9. Roxana Tîmplaru.

Enunț din Kilonova, sub licența CC-BY-NC-SA-4.0, conform politicii sursei. Adaptări de prezentare și tipografie. Exemplele, formulele și figurile originale sunt păstrate.

RÂNDUL TĂU

Trimite o soluție

Editor de cod

Setul original de teste și regulile de punctare sunt în curs de verificare. Trimiterea pentru evaluare va fi disponibilă după această verificare.

Se verifică autentificarea…

Un pas, apoi următorul.Înapoi sus ↑