1839 - Memory006: Difference between revisions
No edit summary |
No edit summary |
||
Line 6: | Line 6: | ||
== Date de intrare == | == Date de intrare == | ||
Fișierul de intrare memory006.in conține | Fișierul de intrare memory006.in conține pe prima linie numerele n şi k, iar pe a doua linie n numere naturale nenule, separate prin spații. | ||
== Date de ieșire == | |||
Fișierul de ieșire memory006.out va conține: | |||
Dacă datele sunt introduse corect, pe ecran se va afișa: | Dacă datele sunt introduse corect, pe ecran se va afișa: | ||
'''"Datele sunt introduse corect."''', apoi pe un rând nou '''numărul S, reprezentând numărul secvenţelor din şir care au produsul elementelor egal cu 2k.''', reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: '''"Datele nu corespund restricțiilor impuse."'''. | '''"Datele sunt introduse corect."''', apoi pe un rând nou '''numărul S, reprezentând numărul secvenţelor din şir care au produsul elementelor egal cu 2k.''', reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: '''"Datele nu corespund restricțiilor impuse."'''. | ||
== Restricţii şi precizări == | == Restricţii şi precizări == | ||
Line 24: | Line 23: | ||
: 7 4 2 4 5 | : 7 4 2 4 5 | ||
; Ieșire | ; Ieșire | ||
: Datele sunt introduse correct | |||
: memory006.out | : memory006.out | ||
: 2 | : 2 | ||
Line 31: | Line 30: | ||
; Intrare | ; Intrare | ||
: memory006.in | : memory006.in | ||
: 5 | : 5 15000 | ||
: 7 4 2 4 5 | : 7 4 2 4 5 | ||
; Ieșire | ; Ieșire | ||
: Datele nu corespund restricțiilor impuse. | |||
: memory006.out | : memory006.out | ||
: Datele nu corespund restricțiilor impuse | : Datele nu corespund restricțiilor impuse | ||
== Rezolvare == | == Rezolvare == | ||
Line 43: | Line 42: | ||
# 1839 - Memory006 | # 1839 - Memory006 | ||
def | def count_subarrays(n, k, arr): | ||
count = 0 | |||
prod = 1 | |||
return | left = 0 | ||
for right in range(n): | |||
prod *= arr[right] | |||
while prod > (2 ** 64) / 2 ** k: | |||
prod //= arr[left] | |||
left += 1 | |||
if prod == 2 ** k: | |||
count += right - left + 1 | |||
return count | |||
if __name__ == '__main__': | |||
with open('memory006.in', 'r') as f_in: | |||
n, k = map(int, f_in.readline().split()) | |||
arr = list(map(int, f_in.readline().split())) | |||
if max(arr) > 10 ** 18 or min(arr) < 1 or k > 10000 or n > 500000: | |||
print("Datele nu corespund restricțiilor impuse.") | |||
else: | |||
print("Datele sunt introduse corect.") | |||
print(count_subarrays(n, k, arr)) | |||
Line 84: | Line 75: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== Explicatie Rezolvare == | == Explicatie Rezolvare == | ||
Funcția | Funcția count_subarrays primește ca argumente lungimea șirului n, numărul natural k și șirul de numere naturale nenule arr. Returnează numărul de subșiruri ale șirului arr care au produsul elementelor egal cu 2^k. | ||
În cadrul funcției, inițializăm count la 0, prod la 1 și left la 0. Parcurgem șirul arr cu un indice right și actualizăm prod înmulțind cu fiecare element arr[right]. În timp ce prod depășește o anumită valoare calculată cu ajutorul lui k, actualizăm prod împărțind cu elementele de la începutul subșirului până când prod este mai mic sau egal cu acea valoare. | |||
Dacă prod este egal cu 2^k, incrementăm count cu numărul de elemente din subșirul curent. | |||
În funcția main, citim datele de intrare din fișierul memory006.in și verificăm dacă acestea corespund restricțiilor impuse în enunțul problemei. Dacă datele sunt valide, apelăm funcția count_subarrays și afișăm rezultatul. Dacă datele nu sunt valide, afișăm un mesaj corespunzător. |
Revision as of 22:22, 13 May 2023
Sursa: - Memory006
Cerinţa
Se dă un şir format din n numere naturale nenule. Să se afle numărul secvenţelor din şir care au produsul elementelor egal cu 2k, unde k este un număr natural dat.
Date de intrare
Fișierul de intrare memory006.in conține pe prima linie numerele n şi k, iar pe a doua linie n numere naturale nenule, separate prin spații.
Date de ieșire
Fișierul de ieșire memory006.out va conține: Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou numărul S, reprezentând numărul secvenţelor din şir care au produsul elementelor egal cu 2k., reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse.".
Restricţii şi precizări
- 1 ≤ n ≤ 500.000
- 1 ≤ k ≤ 10.000
- numerele de pe a doua linie a fișierului de intrare vor fi mai mari decât 1 şi mai mici decât 10^18
Exemplu 1
- Intrare
- memory006.in
- 5 3
- 7 4 2 4 5
- Ieșire
- Datele sunt introduse correct
- memory006.out
- 2
Exemplu 2
- Intrare
- memory006.in
- 5 15000
- 7 4 2 4 5
- Ieșire
- Datele nu corespund restricțiilor impuse.
- memory006.out
- Datele nu corespund restricțiilor impuse
Rezolvare
Rezolvare ver. 1
<syntaxhighlight lang="python" line>
- 1839 - Memory006
def count_subarrays(n, k, arr):
count = 0 prod = 1 left = 0 for right in range(n): prod *= arr[right] while prod > (2 ** 64) / 2 ** k: prod //= arr[left] left += 1 if prod == 2 ** k: count += right - left + 1 return count
if __name__ == '__main__':
with open('memory006.in', 'r') as f_in: n, k = map(int, f_in.readline().split()) arr = list(map(int, f_in.readline().split()))
if max(arr) > 10 ** 18 or min(arr) < 1 or k > 10000 or n > 500000: print("Datele nu corespund restricțiilor impuse.") else: print("Datele sunt introduse corect.") print(count_subarrays(n, k, arr))
</syntaxhighlight>
Explicatie Rezolvare
Funcția count_subarrays primește ca argumente lungimea șirului n, numărul natural k și șirul de numere naturale nenule arr. Returnează numărul de subșiruri ale șirului arr care au produsul elementelor egal cu 2^k.
În cadrul funcției, inițializăm count la 0, prod la 1 și left la 0. Parcurgem șirul arr cu un indice right și actualizăm prod înmulțind cu fiecare element arr[right]. În timp ce prod depășește o anumită valoare calculată cu ajutorul lui k, actualizăm prod împărțind cu elementele de la începutul subșirului până când prod este mai mic sau egal cu acea valoare.
Dacă prod este egal cu 2^k, incrementăm count cu numărul de elemente din subșirul curent.
În funcția main, citim datele de intrare din fișierul memory006.in și verificăm dacă acestea corespund restricțiilor impuse în enunțul problemei. Dacă datele sunt valide, apelăm funcția count_subarrays și afișăm rezultatul. Dacă datele nu sunt valide, afișăm un mesaj corespunzător.