2141 - Exp

From Bitnami MediaWiki
Revision as of 21:39, 9 December 2023 by Gabii (talk | contribs) (radical de ordin m din (x1⋅x2⋅…⋅xn) radicalul nu l pot pune =])
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Enunț

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

Cerința

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

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

Î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

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

Exemplul 1:

expIN.txt

2
4
32 81 100 18

expOUt.txt

1
2 4
3 3
5 1

Exemplul 2:

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

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