[CF540D] Bad Luck Island - 概率
Description
给三种人,分别是r,s,p个,在孤岛上,每两个不同种人相遇则互吃,r吃s,s吃p,p吃r。求最后留下单一种族的概率。
Solution
考虑 (f[i][j][k]) 表示剩下 i 个 r,j 个 s,k 个 p 的概率(注意这里对概率的理解,此时样本空间为 i+j+k=C 的所有事件)
转移就是随机抽两个不同人种出来打一架
#include <bits/stdc++.h>
using namespace std;
#define int long long
int r, s, p;
double f[105][105][105];
signed main()
{
ios::sync_with_stdio(false);
cin >> r >> s >> p;
f[r][s][p] = 1;
double ar = 0, as = 0, ap = 0;
for (int i = r; i >= 0; i--)
{
for (int j = s; j >= 0; j--)
{
for (int k = p; k >= 0; k--)
{
if (i && j)
f[i][j - 1][k] += f[i][j][k] * i * j / (i * j + j * k + k * i);
if (j && k)
f[i][j][k - 1] += f[i][j][k] * j * k / (i * j + j * k + k * i);
if (k && i)
f[i - 1][j][k] += f[i][j][k] * k * i / (i * j + j * k + k * i);
if (i && !j && !k)
ar += f[i][0][0];
if (!i && j && !k)
as += f[0][j][0];
if (!i && !j && k)
ap += f[0][0][k];
}
}
}
cout << fixed << setprecision(10) << ar << " " << as << " " << ap << endl;
}