2106 - Armonica
Spunem că trei numere a b c sunt în progresie armonică dacă b este media armonică a numerelor a și c, adică b=2/1a+1c=2⋅a⋅c/a+c
Cerința[edit | edit source]
Cunoscând un număr natural b să se determine toate perechile de numere naturale (a,c) pentru care a b c sunt în progresie armonică.
Date de intrare[edit | edit source]
Fișierul de intrare armonicain.txt conține pe prima linie numărul b.
Date de ieșire[edit | edit source]
Fișierul de ieșire armonicaout.txt va conține pe prima linie numărul n, reprezentând numărul de perechi de numere naturale (a,c) pentru care b este media armonică. Pe următoarele linii se vor afișa perechile de numere cerute. Astfel fiecare dintre următoarele n linii vor conține câte două numere a și c separate printr-un spațiu cu semnificația că b este medie armonică a numerelor a și c.
Restricții și precizări[edit | edit source]
- 1 ≤ b ≤ 1 000 000 000;
- Pentru teste în valoare de 40 de puncte avem b ≤ 1 000 000;
- Perechile de numere din fișierul de ieșire pot fi afișate în orice ordine;
- Dacă b este medie armonică între două numere diferite a și c atunci perechile (a,b) și (c,a) sunt considerate soluții distincte.
- În concurs s-au acordat 10 puncte din oficiu. Pe site se acordă 10 puncte pentru exemplu.
Exemplul 1[edit | edit source]
- armonicain.txt
- 3
- armonicaout.txt
- Datele introduse corespund restricțiilor impuse.
- 3
- 3 3
- 2 6
- 6 2
Explicație[edit | edit source]
Numărul 3 este medie armonică a numerelor 3 și 3. Avem progresia armonică (3,3,3) Numărul 3 este medie armonică a numerelor 2 și 6. Avem progresiile armonice (2,3,6) și (6,3,2).
Exemplul 2[edit | edit source]
- armonicain.txt
- 1000000001
- armonicaout.txt
- Datele introduse nu corespund restricțiilor impuse.
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line="1">
- 2106 - Armonica
def validare(valoaree_b): # functia de validare a datelor de intrare
if valoaree_b < 1 or valoaree_b > 1000000000: raise ValueError fisier_iesire.write("Datele introduse corespund restrictiilor impuse.\n")
def progresie_armonica(valoaree_b): # functia de rezolvare
rezultat = [] for valoaree_a in range(1, valoaree_b + 1): valoaree_c = (valoaree_a * valoaree_b) / (2 * valoaree_a - valoaree_b) if valoaree_c.is_integer() and valoaree_c >= valoaree_a: rezultat.append((valoaree_a, int(valoaree_c))) if valoaree_a != valoaree_c: # Daca a si c sunt diferite, adaugam si perechea (c, a) rezultat.append((int(valoaree_c), valoaree_a)) return rezultat
if __name__ == '__main__':
fisier_intrare = open("armonicain.txt", "r") # declararea fisierelor fisier_iesire = open("armonicaout.txt", "w") # fisierul out trebuie declarat cu optiunea "w" (write)
# din cauza datelor de intrare pot aparea 2 tipuri de erori, valueError sau IndexError pe care le tratam try: valoare_b = int(fisier_intrare.readline()) # citirea datelor de intrare
validare(valoare_b) # apelul functiei de validare rezultate = progresie_armonica(valoare_b) # apelul functiei de rezolvare rezultate.sort(key=lambda x: x[0] + x[1]) # Sortam solutiile in functie de suma a + c fisier_iesire.write(f"{len(rezultate)}\n") for valoare_a, valoare_c in rezultate: fisier_iesire.write(f"{valoare_a} {valoare_c}\n")
except ValueError: fisier_iesire.write("Datele introduse nu corespund restrictiilor impuse.")
</syntaxhighlight>