Уявімо, що гравець одразу витягнув усі кульки у випадковому порядку, тобто отримали випадкову перестановку з n = a + b + c кульок. Гра закінчується, коли вперше закінчився якийсь колір. Отже, перемагає той колір, чия остання кулька стоїть у перестановці раніше за всіх.
Обчислимо ймовірність золотого джекпоту. Щоб червоний виграв, остання кулька ряду має бути зеленою або синьою. Розберемо обидва випадки.
Випадок А: Ймовірність того, що остання кулька ряду зелена, дорівнює (зелених кульок штук із ). Зелені програли. Залишилися червоні та сині, і треба зрозуміти, хто з них переможе.
Умовно викинемо зелені кульки з ряду та подивимось лише на червоні й сині (їх a + c штук). Червоний переможе, якщо найостанніша серед червоних і синіх кульок — синя. Ймовірність того, що остання серед a + c кульок синя, дорівнює c / (a + c). Кожна з цих кульок з однаковою ймовірністю може опинитись останньою, а синіх серед них штук.
Ймовірність Випадку дорівнює \frac{b}{n} \cdot \frac{c}{a+c}.
Випадок B: Ймовірність того, що остання кулька ряду синя, дорівнює (синіх кульок штук із ). Сині програли. Викидаємо сині та дивимось на червоні й зелені (їх a + b штук). Червоний переможе, якщо останньою серед них виявилась зелена, ця ймовірність дорівнює b / (a + b).
Ймовірність Випадку дорівнює \frac{c}{n} \cdot \frac{b}{a+b}.
Випадки і не перетинаються (остання кулька не може бути одночасно й зеленою, і синьою), тому ймовірність перемоги червоних становитиме
Аналогічно ймовірність перемоги зелених дорівнює
Ймовірність перемоги синіх дорівнює
Приклад
Розглянемо другий тест (a = 1, b = 2, c = 3, n = a + b + c = 6). Обчислимо ймовірності виграшів джекпотів:
Реалізація алгоритму
Функція gcd обчислює найбільший спільний дільник чисел і .
long long gcd(long long a, long long b)
{
return b == 0 ? a : gcd(b, a % b);
}Функція solve обчислює ймовірність перемоги червоних.
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);
}Основна частина програми. Зчитуємо вхідні дані.
cin >> a >> b >> c;Обчислюємо та виводимо відповідь. Зазначимо, що виклик функції:
solve(a, b, c) обчислює ймовірність перемоги червоних;
solve(b, c, a) обчислює ймовірність перемоги зелених;
solve(c, a, b) обчислює ймовірність перемоги синіх;
cout << solve(a, b, c) << " " << solve(b, c, a) << " "
<< solve(c, a, b) << endl;