2141 - Exp

From Bitnami MediaWiki

Enunț[edit | edit source]

Se dă un şir de n numere naturale nenule x1, x2, …, xn şi un număr natural m.

Cerința[edit | edit source]

Să se verifice dacă valoarea expresiei radical de ordin m din (x1⋅x2⋅…⋅xn) este un număr natural. În caz afirmativ să se afișeze acest număr descompus în factori primi.

Date de intrare[edit | edit source]

Fișierul de intrare expIN.txt conține pe prima linie m, pe linia a doua n, iar pe linia a treia numerele x1, x2, …, xn separate între ele prin câte un spațiu.

Date de ieșire[edit | edit source]

În fișierul de ieșire expOUt.txt se va scrie pe prima linie cifra 0, dacă valoarea expresiei nu este un număr natural, respectiv 1 dacă este un număr natural. Dacă valoarea expresiei este un număr natural pe următoarele linii se vor scrie perechi de forma p e (p este factor prim care apare în descompunere la puterea e>=1). Aceste perechi se vor scrie în ordine crescătoare după primul număr (adică p).

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

  • 0 < n < 5000
  • 0 < xi < 30.001, pentru orice i=1..n
  • m poate fi una din cifrele 2, 3, 4.

Exemplul 1:[edit | edit source]

expIN.txt

2
4
32 81 100 18

expOUt.txt

1
2 4
3 3
5 1

Exemplul 2:[edit | edit source]

expIN.txt

6
6
45 5 44 23 32 32

consola:

Eroare: Numărul m trebuie să fie una din cifrele 2, 3, 4.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> def respecta_restrictiile(m, n, xi):

   if not (0 < n < 5000):
       print("Eroare: Numărul de elemente n trebuie să fie între 0 și 5000.")
       return False
   if not (0 < m < 5):
       print("Eroare: Numărul m trebuie să fie una din cifrele 2, 3, 4.")
       return False
   if not all(0 < x < 30001 for x in xi):
       print("Eroare: Elementele xi trebuie să fie în intervalul (0, 30001).")
       return False
   return True

def este_numar_natural(n):

   return n == int(n) and n > 0

def descompunere_in_factori_primi(numar):

   factori_primi = []
   divizor = 2
   
   while divizor <= numar:
       putere = 0
       while numar % divizor == 0:
           numar //= divizor
           putere += 1
       if putere > 0:
           factori_primi.append((divizor, putere))
       divizor += 1
   
   return factori_primi

def main():

   with open("expIN.txt", "r") as f:
       m = int(f.readline().strip())
       n = int(f.readline().strip())
       xi = list(map(int, f.readline().split()))
   if not respecta_restrictiile(m, n, xi):
       return
   # Restul codului pentru calcule și scrierea în fișier rămâne neschimbat
   produs = 1
   for x in xi:
       produs *= x
   radical_m = produs ** (1/m)
   with open("expOUT.txt", "w") as f:
       if este_numar_natural(radical_m):
           f.write("1\n")
           factori_primi = descompunere_in_factori_primi(int(radical_m))
           for factor, putere in factori_primi:
               f.write(f"{factor} {putere}\n")
       else:
           f.write("0\n")

if __name__ == "__main__":

   main()

</syntaxhighlight>