2714 - Frecv Imp

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Cerinţa

Se dă un șir format din n numere naturale. Toate valorile putere a lui 2 din acest șir au frecvență pară, cu o singură excepție. Determinați această valoare – putere a lui 2 cu frecvență impară.

Date de intrare

Fișierul de intrare frecvimpin.txt conține pe prima linie numărul n, iar pe a doua linie n numere naturale separate prin spații.

Date de ieşire

Fișierul de ieșire frecvimpout.txt va conține pe prima linie numărul p, reprezentând singura valoare din șirul dat care este putere a lui 2 și are frecvență impară.

Restricții și precizări

  • 1 ⩽ n ⩽ 1.000.000
  • numerele de pe a doua linie a fișierului de intrare sunt naturale, nenule și mai mici decât
  • = 2 63 - 1

Exemplul 1

frecvimpin.txt
10
41 235 64 41 512 64 1488 512 361 512
frecvimpout.txt
Datele de intrare corespund restrictiilor impuse
512


Exemplul 2

frecvimpin.txt
-1
22 77 99 11
frecvimp.out
Datele de intrare nu corespund restrictiilor impuse


Explicație

În fișierul de intrare sunt 2 puteri ale lui 2, 64 și 512, dintre care 512 apare de 3 ori.

Rezolvare

# 2714  Frecv Imp
def validare(n_validare, numere_validare):
    # Verificăm dacă n este în intervalul 1-1000000
    if n_validare < 1 or n_validare > 1000000:
        raise ValueError  # Ridicăm o eroare dacă n nu este în intervalul 1-1000000
    for numar in numere_validare:    # Parcurgem lista de numere
        if numar < 1 or numar > 9223372036854775807:
            # Ridicăm o eroare dacă numărul nu este în intervalul 1-9223372036854775807
            raise ValueError
    file_out.write("Datele de intrare corespund restrictiilor impuse\n")


def frecvimp(numere):
    frec = {}    # Inițializăm un dicționar gol
    for numar in numere:    # Parcurgem lista de numere
        # Dacă numărul nu se află încă în dicționar, îl adăugăm cu frecvența 0
        if numar not in frec:
            frec[numar] = 0
        frec[numar] += 1    # Incrementăm frecvența numărului curent

    for numar in frec:    # Parcurgem dicționarul
        # Dacă frecvența numărului curent este impară și dacă numărul este o putere a lui 2
        if frec[numar] % 2 == 1 and (numar & (numar - 1) == 0):
            return numar    # Dacă găsim un astfel de număr îl returnăm


if __name__ == '__main__':
    file_in = open("frecvimpin.txt", "r")    # Deschidem fișierul de intrare pentru citire
    file_out = open("frecvimpout.txt", "w")    # Deschidem fișierul de ieșire pentru scriere

    try:
        # Citim numărul de numere
        n_main = int(file_in.readline())
        # Citim numerele
        numere_main = list(map(int, file_in.readline().split()))
        validare(n_main, numere_main)    # Validăm datele de intrare
        # Calculăm și scriem numărul cu frecvență impară
        rezultat_main = frecvimp(numere_main)
        file_out.write(str(rezultat_main) + '\n')

    except ValueError:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")
    except IndexError:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")