1769 - albume

De la Universitas MediaWiki
Versiunea din 18 mai 2024 14:40, autor: Oros Ioana Diana (discuție | contribuții)
(dif) ← Versiunea anterioară | Versiunea curentă (dif) | Versiunea următoare → (dif)

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

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

Date de ieșire

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

  • 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

albumeIN.txt

2 2 2

albumeOUT.txt

1.666666667

Exemplul 2

albumeIN.txt

232 654 27 

albumeOUT.txt

25.542102567 

Rezolvare

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()