2239 - Pow2: Difference between revisions
Pagină nouă: Se consideră un șir '''a[1]''', '''a[2]''',…, '''a[n]''' de numere naturale nenule. ==Cerință== Să se determine câte perechi de indici '''(i, j), 1 ≤ i < j ≤ n''', există cu proprietatea că suma '''a[i] + a[j]''' este egală cu o putere a lui 2. ==Date de intrare== Programul citește de la tastatură numărul '''n''', iar apoi cele '''n''' numere naturale nenule, separate prin spații. ==Date de ieșire== Programul va afișa pe ecran un singur număr natur... |
|||
(One intermediate revision by one other user not shown) | |||
Line 19: | Line 19: | ||
*Numerele care sunt puteri ale lui 2 sunt 1, 2, 4, 8, 16, 32, … | *Numerele care sunt puteri ale lui 2 sunt 1, 2, 4, 8, 16, 32, … | ||
== | ==Exemplul 1== | ||
;Intrare | ;Intrare | ||
:4 | :4 | ||
:3 5 3 13 | :3 5 3 13 | ||
;Ieșire | ;Ieșire | ||
:Datele de intrare corespund restrictiilor impuse. | |||
:4 | |||
==Exemplul 2== | |||
;Intrare | |||
:4 | :4 | ||
:a | |||
;Ieșire | |||
:Datele de intrare nu corespund restrictiilor impuse. | |||
==Rezolvare== | ==Rezolvare== | ||
<syntaxhighlight lang="python" line="1" start="1"> | <syntaxhighlight lang="python" line="1" start="1"> | ||
def numar_perechi( | def verificare_restrictii(nr_n, nr_a): # functia de verificare a datelor de intrare | ||
if 2 <= nr_n <= 10**5 and all(1 <= a_i <= 10**9 for a_i in nr_a): | |||
return True | |||
else: | |||
return False | |||
def numar_perechi(nr_n, nr_a): | |||
# Generăm toate puterile lui 2 până la 2^30 | # Generăm toate puterile lui 2 până la 2^30 | ||
puteri_de_doi = [2**i for i in range(31)] | puteri_de_doi = [2**i for i in range(31)] | ||
Line 39: | Line 61: | ||
# Inițializăm numărul de perechi cu 0 | # Inițializăm numărul de perechi cu 0 | ||
nr_perechi = 0 | |||
# Parcurgem fiecare element din lista a | # Parcurgem fiecare element din lista a | ||
for i in range( | for i in range(nr_n): | ||
# Pentru fiecare element, parcurgem lista de puteri ale lui 2 | # Pentru fiecare element, parcurgem lista de puteri ale lui 2 | ||
for putere in puteri_de_doi: | for putere in puteri_de_doi: | ||
# Dacă puterea lui 2 este mai mică decât numărul curent, trecem la următoarea putere | # Dacă puterea lui 2 este mai mică decât numărul curent, trecem la următoarea putere | ||
if putere < | if putere < nr_a[i]: | ||
continue | continue | ||
# Calculăm numărul pe care îl căutăm în contor | # Calculăm numărul pe care îl căutăm în contor | ||
numar_cautat = putere - | numar_cautat = putere - nr_a[i] | ||
# Dacă numărul căutat este în intervalul contorului | # Dacă numărul căutat este în intervalul contorului | ||
if numar_cautat <= 2000000: | if numar_cautat <= 2000000: | ||
# Adăugăm la numărul de perechi numărul de apariții al numărului căutat | # Adăugăm la numărul de perechi numărul de apariții al numărului căutat | ||
nr_perechi += contor[numar_cautat] | |||
# Dacă numărul curent este în intervalul contorului | # Dacă numărul curent este în intervalul contorului | ||
if | if nr_a[i] <= 2000000: | ||
# Incrementăm contorul pentru numărul curent | # Incrementăm contorul pentru numărul curent | ||
contor[ | contor[nr_a[i]] += 1 | ||
return nr_perechi | |||
if __name__ == '__main__': | |||
n = int(input()) | try: | ||
a = list(map(int, input().split())) | n = int(input("Introduceti numarul n: ")) # citirea numarului de linii si coloane | ||
a = list(map(int, input().split())) | |||
# | if verificare_restrictii(n, a): # verificam datele de intrare | ||
print(numar_perechi(n, a)) | print("Datele de intrare corespund restrictiilor impuse.") | ||
print(numar_perechi(n, a)) # apelam functia de rezolvare | |||
else: | |||
print("Datele de intrare nu corespund restrictiilor impuse.") | |||
# ne asteptam la 2 tipuri de erori din cauza datelor de intrare, le tratam corespunzator | |||
except ValueError: | |||
print("Datele de intrare nu corespund restrictiilor impuse.") | |||
except IndexError: | |||
print("Datele de intrare nu corespund restrictiilor impuse.") | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 75: | Line 107: | ||
==Explicatii== | ==Explicatii== | ||
Cele patru perechi de indici sunt: (1,2), (1,4), (2,3), (3,4). | Cele patru perechi de indici sunt: '''(1,2), (1,4), (2,3), (3,4)'''. |
Latest revision as of 19:07, 15 November 2023
Se consideră un șir a[1], a[2],…, a[n] de numere naturale nenule.
Cerință[edit | edit source]
Să se determine câte perechi de indici (i, j), 1 ≤ i < j ≤ n, există cu proprietatea că suma a[i] + a[j] este egală cu o putere a lui 2.
Date de intrare[edit | edit source]
Programul citește de la tastatură numărul n, iar apoi cele n numere naturale nenule, separate prin spații.
Date de ieșire[edit | edit source]
Programul va afișa pe ecran un singur număr natural reprezentând numărul de perechi de indici distincți (i, j) cu proprietatea că suma a[i] + a[j] este egală cu o putere a lui 2.
Restricții și precizări[edit | edit source]
- 2 ≤ n ≤ 100.000
- 1 ≤ a[i] ≤ 1.000.000.000, pentru orice i = 1..n
- Numerele care sunt puteri ale lui 2 sunt 1, 2, 4, 8, 16, 32, …
Exemplul 1[edit | edit source]
- Intrare
- 4
- 3 5 3 13
- Ieșire
- Datele de intrare corespund restrictiilor impuse.
- 4
Exemplul 2[edit | edit source]
- Intrare
- 4
- a
- Ieșire
- Datele de intrare nu corespund restrictiilor impuse.
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line="1" start="1">
def verificare_restrictii(nr_n, nr_a): # functia de verificare a datelor de intrare
if 2 <= nr_n <= 10**5 and all(1 <= a_i <= 10**9 for a_i in nr_a): return True else: return False
def numar_perechi(nr_n, nr_a):
# Generăm toate puterile lui 2 până la 2^30 puteri_de_doi = [2**i for i in range(31)]
# Inițializăm un contor pentru fiecare număr posibil din șir contor = [0]*2000001
# Inițializăm numărul de perechi cu 0 nr_perechi = 0
# Parcurgem fiecare element din lista a for i in range(nr_n): # Pentru fiecare element, parcurgem lista de puteri ale lui 2 for putere in puteri_de_doi: # Dacă puterea lui 2 este mai mică decât numărul curent, trecem la următoarea putere if putere < nr_a[i]: continue
# Calculăm numărul pe care îl căutăm în contor numar_cautat = putere - nr_a[i]
# Dacă numărul căutat este în intervalul contorului if numar_cautat <= 2000000: # Adăugăm la numărul de perechi numărul de apariții al numărului căutat nr_perechi += contor[numar_cautat]
# Dacă numărul curent este în intervalul contorului if nr_a[i] <= 2000000: # Incrementăm contorul pentru numărul curent contor[nr_a[i]] += 1
return nr_perechi
if __name__ == '__main__':
try: n = int(input("Introduceti numarul n: ")) # citirea numarului de linii si coloane a = list(map(int, input().split()))
if verificare_restrictii(n, a): # verificam datele de intrare print("Datele de intrare corespund restrictiilor impuse.") print(numar_perechi(n, a)) # apelam functia de rezolvare else: print("Datele de intrare nu corespund restrictiilor impuse.") # ne asteptam la 2 tipuri de erori din cauza datelor de intrare, le tratam corespunzator except ValueError: print("Datele de intrare nu corespund restrictiilor impuse.") except IndexError: print("Datele de intrare nu corespund restrictiilor impuse.")
</syntaxhighlight>
Explicatii[edit | edit source]
Cele patru perechi de indici sunt: (1,2), (1,4), (2,3), (3,4).