2342 - cadouri2

From Bitnami MediaWiki
Revision as of 16:15, 29 April 2023 by Sovago Rares-Andrei (talk | contribs) (→‎Cerința)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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 10​6

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

  1. 2342 - cadouri2

import math

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