2141 - Exp
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 oricei=1..n
m
poate fi una din cifrele2
,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
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()