由于输出概率是要求精度1e-6内即可。
这是个无穷次实验。我们可以设置实验轮数。
由于20次一个人一条命不死的概率是1e-12 基本相当于必死。
我们让轮数为50*20,那么每个人相当于必定50条命都死完。
然后就是概率论的题目了。
某个人赢的概率是:i轮这个人死,其他人在i轮之前死的概率,i取1-n求和。
平的概率就是1减去n个人赢的概率。
以后碰到输出精度,要考虑下近似的 问题,。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 1e5+7;
/*
int head[M],cnt;
void init(){cnt=0,memset(head,-1,sizeof(head));}
struct EDGE{int to,nxt,val;}ee[M*2];
void add(int x,int y){ee[++cnt].nxt=head[x],ee[cnt].to=y,head[x]=cnt;}
*/
/*
10轮不死一条命的概率大约是是 1e-6, 50条命死完维持这个范围是500轮,
如果我们开1000轮,游戏进行1001轮的概率1e-12,相当于不会进行1001轮游戏就会结束
平局相当与 总情况-赢的概率
每个人的k相同,赢得概率都相同,我们只需要算一个人1000轮后恰好赢的概率
相当与其他n-1个前999轮死,那个人前999轮死k-1条命
*/
ld C[1010][1010];
void pre()//n中选m个
{
int n=1000;
C[0][0]=1;
for(int i=1;i<=n;i++)
{
C[i][0]=1;
for(int j=1;j<=i;j++)
C[i][j]=C[i-1][j]+C[i-1][j-1];
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,k;
ld p,fp;
pre();
cin>>n>>k>>p;
ld ans=0;
ld z=0;//计算第i轮恰好死完 的概率和
//某人赢 的概率就是 某人在第i轮死亡其他人在i轮之前死亡的概率和
for(int i=1;i<=1000;i++)//某一个人在第i轮恰好赢的概率
{
if(i<k)continue;
ld tp=C[i-1][k-1]*pow(p,i-k)*pow(1-p,k);//某人恰好在第i轮死亡
ans+=(tp*pow(z,n-1)); //某人在第i轮死亡,其他人在i轮之前死亡
z+=tp;//加上第i轮死亡的概率
}
ans=1-ans*n;
printf("%.10Lf\n",ans);
return 0;
}