2342 - cadouri2: Diferență între versiuni

De la Universitas MediaWiki
(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...)
 
 
Linia 1: Linia 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 ==



Versiunea curentă din 29 aprilie 2023 16:15

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

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

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

  • 1 ≤ N ≤ 1000
  • Numerele înscrise pe cadouri sunt numere naturale cuprinse între 1 și 10​6

Exemple

Exemplul 1

cadouri2.in
3
2 3 4
ecran
Datele sunt introduse corect.
cadouri2.out
8


Exemplul 2

cadouri2.in
5
12 24 3 7 15
ecran
Datele sunt introduse corect.
cadouri2.out
120

Exemplul 3

cadouri2.in
5
10000000 1 1 1 1
ecran
Datele nu corespund restricțiilor impuse.
cadouri2.out



Rezolvare

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

Explicatie

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.