2384 - Divigrup
Cerinţa
Un șir de numere aparțin unui divigrup dacă au același număr de divizori. Scrieți un program care citește un număr natural N și apoi N numere naturale nenule și care determină:
a. câte divigrupuri există în șirul de numere citite b. numărul de numere din fiecare divigrup, urmat de numerele ce aparțin acestuia, în ordine crescătoare.
Date de intrare
Fișierul de intrare divigrup.in conține pe prima linie numărul N, iar pe a doua linie N numere naturale separate prin spații.
Date de ieşire
Fișierul de ieșire divigrup.out va conține pe prima linie numărul K, reprezentând numărul de divigrupuri ce se pot forma cu numerele de pe a doua linie a fișierului de intrare. Pe următoarele K rânduri se vor descrie divigrupurile în ordine descrescătoare a numărului de divizori ai elementelor ce le aparțin, astfel încât fiecare rând va avea următoarea structură: M – numărul de elemente ale divigrupului – x1 x2 x3 … xM – numerele aparținând divigrupului, în ordine crescătoare. Valorile scrise pe un rând vor fi separate prin câte un spațiu.
Restricții și precizări
- 1 ≤ n ≤ 200
- numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât 1000000000
Exemplu
- divigrup.in
- 11
- 21 99 15 9 24 100 45 28 44 4 36
- divigrup.out
- 5
- 2 36 100
- 1 24
- 4 28 44 45 99
- 2 15 21
- 2 4 9
Explicație
Există 5 divigrupuri care sunt descrise pe următoarele 5 rânduri: primul divigrup format din 36 și 100, care au același număr maxim de divizori, următorul divigrup are un singur element, pe 24 care are 8 divizori, al treilea divigrup format din 28, 44, 45 și 99 are 4 elemente, toate având 6 divizori, șamd.
Rezolvare
<syntaxhighlight lang="python" line> import math
- Funcția numar_divizori calculează numărul de divizori ai unui număr.
def numar_divizori(n):
numar = 0 for i in range(1, int(math.sqrt(n)) + 1): if n % i == 0: if n / i == i: numar += 1 else: numar += 2 return numar
- Funcția divigrupuri grupează numerele din șir în funcție de numărul lor de divizori.
def divigrupuri(n, sir):
divigrupuri = {} for numar in sir: divizori = numar_divizori(numar) if divizori not in divigrupuri: divigrupuri[divizori] = [] divigrupuri[divizori].append(numar) for divizori in divigrupuri: divigrupuri[divizori].sort() return divigrupuri
if __name__ == "__main__":
n = 11 sir = [21, 99, 15, 9, 24, 100, 45, 28, 44, 4, 36] # Apelăm funcția divigrupuri cu valorile date și stocăm rezultatul în variabila divigrupuri. divigrupuri = divigrupuri(n, sir) # Afișăm numărul de divigrupuri. print(len(divigrupuri)) # Pentru fiecare divigrup, în ordine descrescătoare a numărului de divizori, # afișăm numărul de elemente din divigrup și elementele divigrupului. for divizori in sorted(divigrupuri.keys(), reverse=True): print(len(divigrupuri[divizori]), *divigrupuri[divizori])
</syntaxhighlight>