这个题说的天花乱坠。 但是在思考后会发现。
对于下棋的天数 n 前 n天一定是赢的 最后一天一定是输的。
那么 就好做了。 第一步肯定 先是求出 一天中赢的概率 或者 输的概率(Q)。
用d【i】【j】 代表 前 i天中 有 j是 赢的 i*p 》= j
对于天数 n 这个期望就是 (1-Q)^n*Q * n;
列出 这个期望的公式。 然后用 裂项相消 的方法 求出 期望的极限值。 就做出来了。
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <cctype>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define maxn 100+10
#define INF 1<<30
int main (){
int t,kase = 0;
scanf("%d",&t);
while(t--){
int up,down,n;
scanf("%d/%d%d",&up,&down,&n);
double p = 1.0*up/down;
double d[maxn][maxn];
// printf("%lf\n",p);
memset(d,0,sizeof(d));
d[0][0] = 1;
for(int i = 1; i <= n; i++){
for(int j = 0; j*down<=up*i; j++){
d[i][j] += d[i-1][j]*(1-p);
if(j)
d[i][j] += d[i-1][j-1]*p;
}
}
double Q = 0;
for(int j = 0; j*down <= up*n; j++){
Q += d[n][j];
}
printf("Case #%d: %d\n",++kase,(int)(1/Q));
}
return 0;
}