1769 - albume

From Bitnami MediaWiki

Tudoraș are o pasiune pentru muzică. El deține câte K albume din discografia fiecăreia dintre cele C formații pe care le ascultă. În fiecare zi, Tudoraș extrage la întamplare exact Q albume din colecția sa, pe care le ascultă în cursul zilei.

La finalul zilei, Tudoraș analizează albumele ascultate. Concret, el numără de la câte formații diferite provin cele Q albume alese și își notează această valoare.

Care va fi media aritmetică a valorilor notate, dacă procesul se repetă pentru un număr infinit de zile? Cu alte cuvinte, care este valoarea medie (expected value) a numărului de formații ascultate într-o zi?

Date de intrare[edit | edit source]

Fișierul albumeIN.txt conține pe prima linie trei valori separate prin spațiu: C K Q.

Date de ieșire[edit | edit source]

Fișierul albumeOUT.txt trebuie să conțină pe prima linie o singură valoare reală: media aritmetică a valorilor notate de Tudoraș. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse".

Restricții și precizări[edit | edit source]

  • 1 ≤ C, K ≤ 1000
  • 1 ≤ Q ≤ min(1000, C*K)
  • Pentru teste în valoare de 10 puncte, K = 1.
  • Pentru alte teste în valoare de 10 puncte, Q = C * K.
  • Pentru alte teste în valoare de 20 de puncte, C * K ≤ 10.
  • În fiecare zi, toate albumele au probabilitate egală de a fi extrase.
  • Rezultatul este considerat corect dacă are o eroare absolută de cel mult 10-6.

Exemplul 1[edit | edit source]

albumeIN.txt

2 2 2

albumeOUT.txt

1.666666667

Exemplul 2[edit | edit source]

albumeIN.txt

232 654 27 

albumeOUT.txt

25.542102567 

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line="1"> def verifica_restrictii(c, k, q):

   if 1 <= c <= 1000 and 1 <= k <= 1000 and 1 <= q <= min(1000, c * k):
       return True
   return False

def main():

   try:
       with open("albumeIN.txt", "r") as fin:
           c, k, q = map(int, fin.readline().split())
       
       if not verifica_restrictii(c, k, q):
           with open("albumeOUT.txt", "w") as fout:
               fout.write("Datele nu corespund restrictiilor impuse")
           return
       
       a = 1.0
       for i in range(q):
           a *= (k * (c - 1.0) - i) / (k * c - i)
       
       rezultat = (1.0 - a) * c
       with open("albumeOUT.txt", "w") as fout:
           fout.write(f"{rezultat:.9f}")
   except Exception as e:
       with open("albumeOUT.txt", "w") as fout:
           fout.write(f"Eroare: {str(e)}")

if __name__ == "__main__":

   main()

</syntaxhighlight>