3433 - Forta
Enunț[edit | edit source]
Forța unui număr natural nenul X este egală cu numărul de divizori pozitivi ai lui X. De exemplu, numărul X = 10 are forţa 4, deoarece 10 are 4 divizori, mulțimea divizorilor fiind D10 = {1,2,5,10}.
Cerința[edit | edit source]
Scrieţi un program care, cunoscând un șir de n numere naturale nenule, rezolvă următoarele cerințe:
1. determină cel mai mic număr din șir care are forța maximă;
2. determină lungimea maximă a unei secvențe formată din numere cu aceeași forţă ce poate fi obținută prin rearanjarea convenabilă a elementelor din șir.
Date de intrare[edit | edit source]
Fișierul de intrare fortain.txt conține pe prima linie numărul c, care reprezintă cerința de rezolvat (1 sau 2), pe a doua linie un număr natural n, iar pe următoarea linie n numere naturale separate prin câte un spațiu, reprezentând elementele șirului.
Date de ieșire[edit | edit source]
Fișierul de ieșire fortaout.txt va conține o singură linie pe care va fi scris un număr natural reprezentând răspunsul la cerința c.
Restricții și precizări[edit | edit source]
- 1 ⩽ n ⩽ 100.000
- 1 ⩽ numere din sir ⩽ 2.000.000.000
Exemplul 1[edit | edit source]
- Intrare
- fortain.txt
- 1
- 6
- 17 243 10 32 25 13
- Ieșire
- Datele de intrare corespund restricțiilor impuse
- fortaout.txt
- 32
Explicație[edit | edit source]
Cerința este 1. D17={1,17}, D243={1,3,9,27,81,243}, D10={1,2,5,10}, D32={1,2,4,8,16,32}, D25={1,5,25}, D13={1,13}. Deci cea mai mare forță este 6, iar numărul minim cu această forță este 32.
Exemplul 2[edit | edit source]
- Intrare
- fortain.txt
- 2
- 8
- 121 10 14 25 49 9 25 15
- Ieșire
- Datele de intrare corespund restricțiilor impuse
- 5
Explicație[edit | edit source]
Cerința este 2. O rearanjare a șirului ar putea fi (10 14 15)(121 25 49 9 25) astfel încât putem obține o secvență de lungime 3 de numere de forță 4 și o secvență de lungime 5 de numere de forță 3.
Exemplul 3[edit | edit source]
- Intrare
- fortain.txt
- 2
- 1000001
- 121 10 14 25 49 9 25 15
- Ieșire
- Datele de intrare NU corespund restricțiilor impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line>
- 3433 - Forta
def valideaza_input(n, arr):
if 1 <= n <= 100000: print("Datele de intrare corespund restricțiilor impuse") else: print("Datele de intrare NU corespund restricțiilor impuse") for x in arr: if not (1 <= x <= 2000000000): print("Datele de intrare NU corespund restricțiilor impuse")
def numar_divizori(x):
count = 0 for i in range(1, x + 1): if x % i == 0: count += 1 return count
def min_numar_cu_max_forta(arr):
min_num = float('inf') max_forta = 0
for num in arr: forta = numar_divizori(num) if forta > max_forta or (forta == max_forta and num < min_num): max_forta = forta min_num = num
return min_num
def lungime_maxima_secventa(arr):
forta_counts = {} lungime_maxima = 0
for num in arr: forta = numar_divizori(num) if forta in forta_counts: forta_counts[forta] += 1 else: forta_counts[forta] = 1
lungime_maxima = max(lungime_maxima, forta_counts[forta])
return lungime_maxima
def rezolva_problema(c, n, arr):
valideaza_input(n, arr) rezultat = 0 if c == 1: rezultat = min_numar_cu_max_forta(arr) elif c == 2: rezultat = lungime_maxima_secventa(arr) else: print("Cerința c trebuie să fie 1 sau 2.")
return rezultat
- Citirea datelor din fișierul de intrare
with open("fortain.txt", "r") as file:
c = int(file.readline().strip()) n = int(file.readline().strip()) arr = list(map(int, file.readline().strip().split()))
- Rezolvarea problemei
rezultat = rezolva_problema(c, n, arr)
- Scrierea rezultatului în fișierul de ieșire
with open("fortaout.txt", "w") as file:
file.write(str(rezultat))
</syntaxhighlight>