Розглянемо гру з точки зору теорії ймовірності:
Кожен кидок незалежний від інших;
Ймовірність виграшу в одному кидку дорівнює ;
Ймовірність невдачі в одному кидку дорівнює 1 - p;
Гравці ходять по колу: 1, 2, ..., n, 1, 2, ...;
Гра закінчується одразу, як тільки хтось виграє.
Нас цікавить ймовірність того, що виграє -й гравець.
Факт виграшу -го гравця означає, що:
до його переможного кидка ніхто не виграв;
на його ході відбулося виграшне подія.
При цьому -й гравець може виграти:
на своєму першому кидку;
на своєму другому кидку;
на своєму третьому кидку;
і так далі.
Підсумкова ймовірність дорівнює сумі ймовірностей усіх цих випадків.
Щоб -ий гравець виграв на своєму першому ході, повинні виконатися дві умови:
Перші i - 1 гравців не виграли. Ймовірність події дорівнює (1 - p)^{i - 1}
-ий гравець виграв. Ймовірність події дорівнює .
Оскільки події незалежні, то ймовірність для -го гравця виграти на своєму першому ході дорівнює
-й гравець виграє на своєму другому ході, якщо:
Всі гравців зробили по одному кидку і програли: (1 - p)^n
Перші i - 1 гравців у другому колі знову програли. Ймовірність події дорівнює (1 - p)^{i - 1}.
-ий гравець виграв. Ймовірність події дорівнює .
Ймовірність для -го гравця виграти на своєму другому ході дорівнює
Аналогічно розмірковуючи, ми отримаємо що ймовірність для -го гравця виграти на своєму -ому ході дорівнює
Тепер залишається підсумувати отримані ймовірності. Загальна ймовірність виграшу -го гравця дорівнює
У дужках знаходиться нескінченна геометрична прогресія з першим членом і знаменником (1 - p)^n. Ймовірність виграшу дорівнює
Окремо слід зазначити, що при p = 0 відповідь дорівнює .
Реалізація алгоритму
Читаємо вхідні дані.
scanf("%d",&t);
while(t--)
{
scanf("%d %lf %d",&n,&p,&i);Якщо ймовірність дорівнює , то виводимо .
if (p == 0) printf("0\n");
else
{Інакше шукану ймовірність обчислюємо за наведеною вище формулою. Результат виводимо з знаками після десяткової точки.
res = p * pow(1 - p,i - 1) / (1 - pow(1 - p,n));
printf("%.4lf\n",res);
}
}