3486 - Factorul IX
Cerința[edit | edit source]
Numim factorul-x a 2
numere produsul tuturor factorilor primi comuni și diferiți ai celor 2
numere.
Se dau n
numere naturale distincte. Se cere să se afle câți factori-x diferiți pot fi obținuți din toate perechile diferite de numere din șir și să se afișeze aceștia.
Date de intrare[edit | edit source]
Fișierul de intrare factorulx.in
conține pe prima linie numărul n
, iar pe a doua linie n
numere naturale distincte separate prin spații.
Date de ieșire[edit | edit source]
Fișierul de ieșire factorulx.out
va conține pe prima linie numărul de factori-x diferiți care pot fi obținuți din toate perechile diferite de numere din șir, iar pe a 2
-a linie toți aceștia, afișați în ordine crescătoare și separați prin câte un spațiu.
Restricții și precizări[edit | edit source]
1 ≤ n ≤ 1000
- numerele de pe a doua linie a fișierului de intrare vor fi distincte și mai mici decât
2.000.000.000
- dacă
2
numere nu au niciun factor prim comun, atunci, prin convenție se alege ca factorul-x al celor2
numere să fie1
- punctajul pe test va fi acordat doar dacă ambele numere afișate sunt corecte.
Exemplu:[edit | edit source]
factorulx.in
9 2 4 6 7 9 15 18 20 21
factorulx.out
6 1 2 3 5 6 7
Explicatie:[edit | edit source]
Factorul-x pentru 15
și 18
este 3
(3
este singurul lor factor prim comun), pentru 7
și 21
este 7
(la fel ca în cazul anterior), pentru 6
și 18
este 6
(2 * 3
), pentru 2
și 7
este 1
etc.
Încărcare soluție[edit | edit source]
<syntaxhighlight line="1"> import math
f = open("factorulx.in", "r") g = open("factorulx.out", "w")
def factorx(n):
P = 1 if n % 2 == 0: P *= 2 while n % 2 == 0: n >>= 1 for i in range(3, int(math.sqrt(n)) + 1, 2): if n % i == 0: P *= i while n % i == 0: n = n // i if n > 2: P *= n return P
n = int(f.readline()) v = [0] * 1024 fact = [0] * 524288
i = 0 j = 0 m = 0 k = 0 P = 0
for i in range(1, n + 1):
v[i] = int(f.readline())
for i in range(1, n):
for j in range(i + 1, n + 1): m = math.gcd(v[i], v[j]) P = factorx(m) if P not in fact[1:k + 1]: k += 1 fact[k] = P fact[1:k + 1].sort()
g.write(str(k) + '\n') fact[1:k + 1].sort() for i in range(1, k + 1):
g.write(str(fact[i]) + " ")
f.close() g.close()
</syntaxhighlight>