题意:一场比赛有2n-1局,先赢n局者赢,A赢每一场比赛是一个独立事件,概率为p,问A赢得比赛的概率。
思路:f(i, j) 前i场比赛赢j场的概率
#include<bits/stdc++.h>
#define SPEED_UP iostream::sync_with_stdio(false);
using namespace std;
#define rep(i, s, t) for(int (i)=(s);(i)<=(t);++(i))
#define urep(i, s, t) for(int (i)=(s);(i)>=(t);--(i))
typedef long long LL;
const int Maxn = 50;
double f[Maxn+5][Maxn+5];
int t, n;
double p;
double solve() {
rep(i, 0, Maxn)
rep(j, 0, Maxn) f[i][j] = 0;
cin >> n >> p;
double ret = 0;
f[1][1] = p, f[1][0] = 1-p;
rep(i, 2, 2*n-1) {
f[i][0] = f[i-1][0]*(1-p);
f[i][n] = f[i-1][n-1]*p;
for(int j=max(1, i-n+1);j<=min(n-1, i);++j)
f[i][j] = f[i-1][j]*(1-p) + f[i-1][j-1]*p;
}
rep(i, n, 2*n-1) ret += f[i][n];
return ret;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("input.in", "r", stdin);
#endif
SPEED_UP
cin >> t;
cout.setf(ios::fixed, ios::floatfield);
rep(i, 1, t) {
cout << setprecision(2) << solve() << endl;
}
return 0;
}