2342 - cadouri2: Difference between revisions
Pagină nouă: ==Cerința== După ce au trecut sărbătorile, ca în fiecare an, Moș Crăciun a început să facă inventarul cadourilor rămase pentru anul următor. El are N cadouri și pe fiecare cadou este scris un număr natural. În fiecare an Moș Crăciun trebuie să noteze într-un carnețel cantitatea de fericire pe care o aduc aceste cadouri copiilor. Pentru a calcula această valoare, prima dată el trebuie să înmulțească toate numerele înscrise pe cele N cadouri. Astfel... |
|||
Line 1: | Line 1: | ||
==Cerința== | ==Cerința== | ||
După ce au trecut sărbătorile, ca în fiecare an, Moș Crăciun a început să facă inventarul cadourilor rămase pentru anul următor. El are N cadouri și pe fiecare cadou este scris un număr natural. În fiecare an Moș Crăciun trebuie să noteze într-un carnețel cantitatea de fericire pe care o aduc aceste cadouri copiilor. | După ce au trecut sărbătorile, ca în fiecare an, Moș Crăciun a început să facă inventarul cadourilor rămase pentru anul următor. El are '''N''' cadouri și pe fiecare cadou este scris un număr natural. În fiecare an Moș Crăciun trebuie să noteze într-un carnețel cantitatea de fericire pe care o aduc aceste cadouri copiilor. | ||
Pentru a calcula această valoare, prima dată el trebuie să înmulțească toate numerele înscrise pe cele N cadouri. Astfel el obține un număr foarte mare. Apoi el știe că numărul de divizori al acestui număr este cantitatea de fericire pe care el trebuie să o scrie în carnețel. Ajutați-l pe Moș Crăciun să afle cantitatea de fericire a celor N cadouri. Deoarece acest număr este foarte mare voi trebuie sa aflați doar restul împărțirii la '''1.000.000.007'''. | Pentru a calcula această valoare, prima dată el trebuie să înmulțească toate numerele înscrise pe cele N cadouri. Astfel el obține un număr foarte mare. Apoi el știe că numărul de divizori al acestui număr este cantitatea de fericire pe care el trebuie să o scrie în carnețel. Ajutați-l pe Moș Crăciun să afle cantitatea de fericire a celor N cadouri. Deoarece acest număr este foarte mare voi trebuie sa aflați doar restul împărțirii la '''1.000.000.007'''. | ||
== Date de intrare == | == Date de intrare == | ||
Latest revision as of 16:15, 29 April 2023
Cerința[edit | edit source]
După ce au trecut sărbătorile, ca în fiecare an, Moș Crăciun a început să facă inventarul cadourilor rămase pentru anul următor. El are N cadouri și pe fiecare cadou este scris un număr natural. În fiecare an Moș Crăciun trebuie să noteze într-un carnețel cantitatea de fericire pe care o aduc aceste cadouri copiilor.
Pentru a calcula această valoare, prima dată el trebuie să înmulțească toate numerele înscrise pe cele N cadouri. Astfel el obține un număr foarte mare. Apoi el știe că numărul de divizori al acestui număr este cantitatea de fericire pe care el trebuie să o scrie în carnețel. Ajutați-l pe Moș Crăciun să afle cantitatea de fericire a celor N cadouri. Deoarece acest număr este foarte mare voi trebuie sa aflați doar restul împărțirii la 1.000.000.007.
Date de intrare[edit | edit source]
Pe prima linie a fișierului de intrare cadouri2.in se află numărul natural N. Pe următoarea linie se află N numere naturale reprezentând numerele care sunt scrise pe cele N cadouri.
Date de ieșire[edit | edit source]
Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect." In fișierul de ieșire cadouri2.out trebuie să se afle un singur număr care reprezintă cantitatea de fericire a celor N cadouri modulo 1.000.000.007
În cazul în care datele nu respectă restricțiile, se va afișa: "Datele nu corespund restricțiilor impuse.".
Restricţii şi precizări[edit | edit source]
- 1 ≤ N ≤ 1000
- Numerele înscrise pe cadouri sunt numere naturale cuprinse între 1 și 106
Exemple[edit | edit source]
Exemplul 1[edit | edit source]
- cadouri2.in
- 3
- 2 3 4
- ecran
- Datele sunt introduse corect.
- cadouri2.out
- 8
Exemplul 2[edit | edit source]
- cadouri2.in
- 5
- 12 24 3 7 15
- ecran
- Datele sunt introduse corect.
- cadouri2.out
- 120
Exemplul 3[edit | edit source]
- cadouri2.in
- 5
- 10000000 1 1 1 1
- ecran
- Datele nu corespund restricțiilor impuse.
- cadouri2.out
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line="1">
- 2342 - cadouri2
import math
- Funcție pentru validarea datelor de intrare
def validate_input(n, a):
if not (1 <= n <= 1000): return False if not all(1 <= x <= 10**6 for x in a): return False return True
- Funcție pentru calcularea produsului factorilor primi ai tuturor numerelor și numărul de apariții a fiecărui factor prim
def calculate_factors(n, a):
primes = [] for i in range(2, int(math.sqrt(10**6)) + 1): if all(i % p != 0 for p in primes): primes.append(i)
freq = [0] * len(primes) for num in a: for i in range(len(primes)): while num % primes[i] == 0: freq[i] += 1 num //= primes[i]
result = 1 for f in freq: result = (result * (f + 1)) % 1_000_000_007
return result
if __name__ == '__main__':
# Citim datele de intrare din fișier with open('cadouri2.in', 'r') as f: n = int(f.readline().strip()) a = list(map(int, f.readline().strip().split()))
# Verificăm validitatea datelor de intrare if not validate_input(n, a): print("Datele nu corespund restricțiilor impuse.") else: print("Datele sunt introduse corect.")
# Calculăm rezultatul și îl scriem în fișierul de ieșire with open('cadouri2.out', 'w') as g: g.write(str(calculate_factors(n, a))))
</syntaxhighlight>
Explicatie[edit | edit source]
calculate_factors(n, a): această funcție primește ca parametri un număr întreg n și un vector a de dimensiune n care conține numere naturale. Scopul acestei funcții este să calculeze produsul numărului de divizori ai fiecărui număr din vectorul a. Pentru a face acest lucru, funcția iterează prin fiecare element din vectorul a și calculează divizorii acelui număr. Acești divizori sunt stocați într-un dicționar care numără de câte ori apare fiecare divizor. La final, funcția calculează produsul dintre numărul de divizori pentru fiecare element și returnează rezultatul.
validate_input(n, a): această funcție primește ca parametri un număr întreg n și un vector a de dimensiune n care conține numere naturale. Scopul acestei funcții este să valideze datele de intrare și să verifice dacă respectă restricțiile impuse. Funcția verifică dacă n și fiecare element din vectorul a sunt numere naturale nenule, mai mici sau egale cu 10^6. De asemenea, funcția verifică dacă produsul elementelor din vectorul a este mai mic sau egal cu 10^9 sau 10^12, în funcție de valoarea lui n. Funcția returnează True dacă datele de intrare sunt valide și False în caz contrar.
main(): această funcție este funcția principală a programului. Ea deschide fișierul de intrare, citește datele de intrare și validează datele folosind funcția validate_input(). Dacă datele sunt invalide, funcția afișează un mesaj corespunzător și se oprește. Dacă datele sunt valide, funcția calculează produsul numărului de divizori folosind funcția calculate_factors(), apoi afișează rezultatul pe ecran și îl scrie în fișierul de ieșire.