dp[i]表示一个人在前i轮死亡的概率
一个人在第i轮胜出的概率=(其余在前i死亡的概率-其余人在前i-1轮死亡的概率)*这个人前i轮不死的概率
pass:感觉正解有点奇怪
/* dp[i]表示一个人在前i轮死亡的概率 一个人在第i轮胜出的概率=(其余在前i死亡的概率-其余人在前i-1轮死亡的概率)*这个人前i轮不死的概率 */ #include<bits/stdc++.h> using namespace std; #define N 2005 typedef double db; int n,k; db C[N][N],dpp[N],dp[N],p; void init(){ C[0][0]=1; for(int i=0;i<N;i++){ C[i][0]=C[i][i]=1; for(int j=1;j<i;j++) C[i][j]=C[i-1][j-1]+C[i-1][j]; } } int main(){ init(); cin>>n>>k>>p; for(int i=k;i<=1000;i++) for(int j=0;j<k;j++) dpp[i]+=C[i][j]*pow(p,i-j)*pow(1-p,j); for(int i=k;i<=1000;i++) dp[i]=dp[i-1]+C[i-1][k-1]*pow(p,i-k)*pow(1-p,k); db sum=0; for(int i=k;i<=1000;i++)//前k轮游戏结束的概率 sum+=dpp[i]*(pow(dp[i],n-1)-pow(dp[i-1],n-1)); cout<<1-sum*n; //printf("%.10lf ",ans); }