2714 - Frecv Imp: Diferență între versiuni

De la Universitas MediaWiki
mFără descriere a modificării
Fără descriere a modificării
Linia 2: Linia 2:
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ă.
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 ==
== Date de intrare ==
Fișierul de intrare '''frecvimp.in''' conține pe prima linie numărul '''n''', iar pe a doua linie '''n''' numere naturale separate prin spații.
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 ==
== Date de ieşire ==
Fișierul de ieșire '''frecvimp.out''' 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ă.
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 ==
== Restricții și precizări ==
* 1 ⩽ n ⩽ 1.000.000
* 1 ⩽ n ⩽ 1.000.000
* numerele de pe a doua linie a fișierului de intrare sunt naturale, nenule și mai mici decât <math> 9223372036854775807 </math>
* numerele de pe a doua linie a fișierului de intrare sunt naturale, nenule și mai mici decât <math> 9223372036854775807 </math>
* <math> 9223372036854775807 </math> = 2 <sup> 63 </sup> - 1
* <math> 9223372036854775807 </math> = 2 <sup> 63 </sup> - 1
== Exemplu ==
== Exemplul 1 ==
; frecvimp.in
; frecvimpin.txt
: 10
: 10
: 41 235 64 41 512 64 1488 512 361 512
: 41 235 64 41 512 64 1488 512 361 512
<br>
; frecvimpout.txt
: Datele de intrare corespund restrictiilor impuse
: 512
== Exemplul 2 ==
; frecvimpin.txt
: -1
: 22 77 99 11
; frecvimp.out
; frecvimp.out
: 512
: Datele de intrare nu corespund restrictiilor impuse
== Explicație ==
== Explicație ==
În fișierul de intrare sunt '''2''' puteri ale lui 2, '''64''' și '''512''', dintre care '''512''' apare de '''3''' ori.
În fișierul de intrare sunt '''2''' puteri ale lui 2, '''64''' și '''512''', dintre care '''512''' apare de '''3''' ori.
== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
# Definim funcția
# 2714  Frecv Imp
def FrecvImp(n):
def validare(n_validare, numere_validare):
     # Inițializăm un dicționar gol
     # Verificăm dacă n este în intervalul 1-1000000
     frec = {}
     if n_validare < 1 or n_validare > 1000000:
     # Parcurgem lista de numere
        raise ValueError  # Ridicăm o eroare dacă n nu este în intervalul 1-1000000
     for n in n:
     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
         # Dacă numărul nu se află încă în dicționar, îl adăugăm cu frecvența 0
         if n not in frec:
         if numar not in frec:
             frec[n] = 0
             frec[numar] = 0
         # Incrementăm frecvența numărului curent
         frec[numar] += 1    # Incrementăm frecvența numărului curent
         frec[n] += 1
 
    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


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


# Deschidem fișierul de intrare și citim datele
if __name__ == '__main__':
with open('frecvimp.in', 'r') as intrare:
     file_in = open("frecvimpin.txt", "r")   # Deschidem fișierul de intrare pentru citire
     n = int(intrare.readline())
     file_out = open("frecvimpout.txt", "w")   # Deschidem fișierul de ieșire pentru scriere
    # Citim a doua linie, o împărțim în cuvinte separate prin spații și convertim fiecare cuvânt la int
     numere = list(map(int, intrare.readline().split()))


# Apelăm funcția
    try:
result = FrecvImp(numere)
        # 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')


# Deschidem fișierul de ieșire și scriem rezultatul
    except ValueError:
with open('frecvimp.out', 'w') as iesire:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")
    iesire.write(str(result))
    except IndexError:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")


</syntaxhighlight>
</syntaxhighlight>

Versiunea de la data 10 noiembrie 2023 12:48

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")