Immaginiamo che il giocatore abbia estratto subito tutte le palline in ordine casuale, cioè abbiamo ottenuto una permutazione casuale di n = a + b + c palline. Il gioco termina quando per la prima volta finisce un colore. Quindi vince il colore la cui ultima pallina si trova nella permutazione prima di tutte le altre.
Calcoliamo la probabilità del jackpot d'oro (rosso). Affinché il rosso vinca, l'ultima pallina della fila deve essere verde o blu. Analizziamo entrambi i casi.
Caso A: La probabilità che l'ultima pallina della fila sia verde è uguale a (le palline verdi sono su ). Il verde ha perso. Restano il rosso e il blu, e bisogna capire chi di loro vincerà.
Immaginiamo mentalmente di togliere le palline verdi dalla fila e guardiamo solo le palline rosse e blu (ce ne sono a + c). Il rosso vince se l'ultima tra le palline rosse e blu è blu. La probabilità che l'ultima tra a + c palline sia blu è uguale a c / (a + c). Ciascuna di queste palline può risultare l'ultima con uguale probabilità, e tra esse ci sono palline blu.
La probabilità del Caso è uguale a \frac{b}{n} \cdot \frac{c}{a+c}.
Caso B: La probabilità che l'ultima pallina della fila sia blu è uguale a (le palline blu sono su ). Il blu ha perso. Togliamo le palline blu e guardiamo le palline rosse e verdi (ce ne sono a + b). Il rosso vince se tra loro l'ultima risulta verde, questa probabilità è uguale a b / (a + b).
La probabilità del Caso è uguale a \frac{c}{n} \cdot \frac{b}{a+b}.
I casi e non si intersecano (l'ultima pallina non può essere contemporaneamente verde e blu), quindi la probabilità di vittoria del rosso sarà
Analogamente, la probabilità di vittoria del verde è uguale a
La probabilità di vittoria del blu è uguale a
Esempio
Consideriamo il secondo test (a = 1, b = 2, c = 3, n = a + b + c = 6). Calcoliamo le probabilità di vincita dei jackpot:
Implementazione dell'algoritmo
La funzione gcd calcola il massimo comun divisore dei numeri e .
long long gcd(long long a, long long b)
{
return b == 0 ? a : gcd(b, a % b);
}La funzione solve calcola la probabilità di vittoria del rosso.
string solve(int a, int b, int c)
{
int n = a + b + c;
int q1 = n * (a + c);
int q2 = n * (a + b);
long long p = (long long)b * c * (q1 + q2);
long long q = (long long)q1 * q2;
long long g = gcd(p, q);
return to_string(p / g) + "/" + to_string(q / g);
}Parte principale del programma. Leggiamo i dati di input.
cin >> a >> b >> c;Calcoliamo e stampiamo la risposta. Notiamo che la chiamata della funzione:
solve(a, b, c) calcola la probabilità di vittoria del rosso;
solve(b, c, a) calcola la probabilità di vittoria del verde;
solve(c, a, b) calcola la probabilità di vittoria del blu;
cout << solve(a, b, c) << " " << solve(b, c, a) << " "
<< solve(c, a, b) << endl;