2306 - Numere 22

From Bitnami MediaWiki
Revision as of 21:09, 25 April 2023 by Paul Matei (talk | contribs) (Pagină nouă: == Cerinţa == Se dau două numere prime '''p''', '''q''' și '''n''' numere naturale nenule. Determinați exponentul maxim '''E''' pentru care numărul '''pE⋅qE''' divide produsul celor '''n''' numere date. == Date de intrare == Programul citește de la tastatură numere '''p q n''', iar apoi '''n''' numere naturale, separate prin spaţii. == Date de ieşire == Programul afișează pe ecran numărul '''E''', reprezentând numărul cerut. == Restricții și precizări == *'...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Cerinţa[edit | edit source]

Se dau două numere prime p, q și n numere naturale nenule. Determinați exponentul maxim E pentru care numărul pE⋅qE divide produsul celor n numere date.

Date de intrare[edit | edit source]

Programul citește de la tastatură numere p q n, iar apoi n numere naturale, separate prin spaţii.

Date de ieşire[edit | edit source]

Programul afișează pe ecran numărul E, reprezentând numărul cerut.

Restricții și precizări[edit | edit source]

  • 1 ≤ n ≤ 1000
  • cele n numere citite vor fi mai mici decât 1.000.000.000

Exemplu[edit | edit source]

Intrare
7 2 5

72 56 70 9 700

Ieșire
3

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> import math

def validare_date(p, q, n):

   """
   Verifică dacă valorile de intrare sunt valide, bazate pe anumite restricții.
   Returnează True dacă sunt valide, False altfel.
   """
   if not (2 <= p <= 10**9):
       return False
   if not (2 <= q <= 10**9):
       return False
   if not (1 <= n <= 10**5):
       return False
   return True

def calculeaza_puteri(p, q, n, nums):

   p1 = p2 = 0
   for tmp in nums:
       d = 2
       while d * d <= tmp:
           p = 0
           while tmp % d == 0:
               tmp //= d
               p += 1
           if d == p:
               p1 += p
           if d == q:
               p2 += p
           d += 1
       if tmp > 1:
           if tmp == p:
               p1 += 1
           elif tmp == q:
               p2 += 1
   return min(p1, p2)

if __name__ == '__main__':

   # citeste valorile de intrare
   p, q, n = map(int, input().split())
   nums = list(map(int, input().split()))
   # valideaza valorile de intrare
   if validare_date(p, q, n):
       # calculeaza puterile si afiseaza rezultatul
       result = calculeaza_puteri(p, q, n, nums)
       print(result)
       print("\nDatele de intrare corespund restricțiilor impuse.\n")
   else:
       print("Datele de intrare nu corespund restricțiilor impuse.")


</syntaxhighlight>

Explicație rezolvare[edit | edit source]

Soluția calculează numărul minim de numere dintr-o listă care au ca factori primi doar numerele a și b date. Algoritmul descompune fiecare număr în factori primi, numără factorii primi egali cu p și q și returnează minimul dintre cele două valori. În plus, soluția include o funcție de validare a datelor de intrare.