解题报告:由于每天晚上垂头丧气的概率都相同,设为Q,那么可以分开处理,DP算出Q
设f[i][j]表示一共打了i场,赢了j场的概率
(f[i][j]=f[i-1][j-1]*p+f[i-1][j]*(1-p))
最后(Q=sum_{i=0}^nf[n][i](i<=n*p))
最后答案即为1/Q,详细证明见蓝书
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N=105;
double f[N][N];int CNT=0;
void work()
{
memset(f,0,sizeof(f));
int a,b,n;
scanf("%d/%d%d",&a,&b,&n);
double p=(double)a/(b*1.0);
f[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j*b<=i*a;j++){
f[i][j]=f[i-1][j]*(1-p);
if(j)f[i][j]+=f[i-1][j-1]*p;
}
}
double tot=0;
for(int i=0;i*b<=a*n;i++)tot+=f[n][i];
int ans=1/tot;
printf("Case #%d: %d
",CNT,ans);
}
int main()
{
int T;cin>>T;
while(T--)CNT++,work();
return 0;
}