2106 - Armonica

From Bitnami MediaWiki

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">

  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>