# PBinfo #1122 – Babilon – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: deivid

## Enunț

Babilonienii au dezvoltat  un sistem pozițional de scriere a numerelor, în care orice număr natural se poate reprezenta utilizând semnele  (unu),  (zece) şi spaţii. 

Valorile k din {2, 3, … , 9} se obțin scriind semnul  de k ori (scrierea babiloniană a lui 3 este    ). 

Numerele 11, 12, … , 59 se obțin ca succesiuni de semne  urmate de semne  (43 se reprezintă ca 
       ). 

Sistemul folosește gruparea unităților câte șaizeci. Astfel, pentru a scrie umărul șaizeci se folosește același semn ca pentru unu, dar valoarea sa este dată de poziția în care se găsește semnul  .

Babilonienii nu foloseau cifra 0. Pentru poziţionarea corectă a semnelor se utiliza spațiu  (60 se reprezintă ca   , 3600 se reprezintă ca    etc.). 

Se codifică scrierea babiloniană a unui număr utilizând cifra 1 în locul semnului  , cifra 2 în locul semnului  și cifra 3 în loc de spațiu, ca în exemplele de mai jos:

 Scrierea babiloniană                        
Codificarea scrierii babiloniene

1311

12

1221111

123111

Valoarea zecimală a numărului

1*60+2=62

1*60+10=70

1*60+20+4=84

1*60*60+10*60+3=4203

Cerință
Dându-se un număr natural n și un șir de n cifre din mulțimea {1, 2, 3}, reprezentând codificarea scrierii babiloniene a unui număr natural, să se determine: 
a) numărul maxim de cifre 1 aflate pe poziții consecutive în  codificarea scrierii babiloniene date;
b) numărul natural din sistemul zecimal corespunzător scrierii babiloniene date.

Date de intrare
Fișierul de intrare babilon.in conține:


pe prima linie un număr natural p ( 1 ≤ p ≤ 2 );
pe a doua linie un număr natural n;
pe a treia linie n cifre separate prin câte un spațiu, reprezentând codificarea scrierii babiloniene a unui număr natural.

Date de ieșire
Dacă valoarea lui p este 1, atunci se va rezolva numai punctul a) din cerință. În acest caz, fişierul de ieşire babilon.out va conţine pe prima linie un număr natural reprezentând numărul maxim de cifre 1 aflate pe poziții consecutive în  codificarea scrierii babiloniene date.

Dacă valoarea lui p este 2, atunci se va rezolva numai punctul b) din cerință. În acest caz, fişierul de ieşire babilon.out va conţine pe prima linie numărul natural corespunzător scrierii babiloniene date.

Restricții și precizări

2 ≤ n ≤ 109;
se garantează faptul că numărul de cifre al rezultatului de la punctul b) (numărul zecimal) este mai mic decât 20;
30% din teste vor avea pe prima linie valoarea 1,  iar restul de 70% din teste vor avea pe prima linie valoarea 2.

Exemplul 1
babilon.in

1
8
1 1 3 2 1 1 1 2
babilon.out

3
Explicație
1 1 3 2 1 1 1 2. Cea mai lungă secvență de cifre 1 are lungimea 3.

Exemplul 2
babilon.in

2
7
1 1 3 2 1 1 1
babilon.out

7213
Explicație

2 se înmulțește de două ori cu 60 (o dată pentru că este urmat de spațiu și încă o dată pentru că precede o grupă care începe cu semnul  ), apoi se adună valoarea 13.

2*60*60+10+3=7213

Exemplul 3
babilon.in

2
9
1 1 1 2 1 1 2 2 1
babilon.out

11541
Explicație

3 se înmulțește cu 60 de două ori pentru că este precedat de două grupe care încep cu semnul  , apoi se adună 12 înmulţit cu 60 şi la final se adună 21.

3*60*60+12*60+21=11541

## Cod sursă C++

```cpp
//Florentina Ungureanu - Colegiul National de Informatica Piatra-Neamt
#include <fstream>
#include <iostream>
#include <string.h>
using namespace std;
unsigned n, v, a, b, c;
ifstream f("babilon.in");
ofstream g("babilon.out");
int main()
{
    long long z=0;
    unsigned i, fr, fmax;
    f>>v>>n;
    if(v==1)
    {
        f>>a;
        fmax=fr=a==1;
        for(i=2;i<=n;i++)
        {
            f>>b;
            if(a*b==1) fr++;
              else  {
                        if (fr>fmax) fmax=fr;
                        fr=b==1;
                    }
            a=b;
        }
      if (fr>fmax) fmax=fr;
      g<<fmax<<'\n';
    }
    else
    { f>>a;
      if(a==1)z=1;
          else if(a==2)z=10;
                else z=0;
      for(i=2;i<=n;i++)
        {
            f>>b;
            if (b>a) z=z*60;
            if(b==1)z++;
                else if(b==2)z+=10;
            if (b!=3)   a=b;
        }
      g<<z<<'\n';
    }
    f.close();
    g.close();
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/1122)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/1122/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-1122/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
