https://code.google.com/codejam/contest/32005/dashboard#s=p2
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
int main(){
int t; scanf("%d", &t);
for(int f = 1; f <= t; f ++){
int m; double p, x;
scanf("%d%lf%lf", &m, &p, &x);
int size = (1 << m) + 1;
double dp[2][size + 10];
memset(dp, 0, sizeof(dp));
dp[0][0] = 0; dp[0][1] = p; dp[0][2] = 1;
for(int i = 0; i < m - 1; i ++){
int ss = (1 << (i + 1)) + 1;
for(int j = 1; j < ss; j ++){
double temp = 0;
for(int k = 1; k <= j && k + j - 1 < ss; k ++)
temp = max(temp, dp[i & 1][j - k] * (1 - p) + p * dp[i & 1][j + k - 1]);
dp[(i + 1) & 1][(j << 1) - 1] = temp;
if(j < (1 << (i + 1))){
temp = dp[i & 1][j];
for(int k = 1; k <= j && k + j < ss; k ++)
temp = max(temp, dp[i & 1][j - k] * (1 - p) + p * dp[i & 1][j + k]);
dp[(i + 1) & 1][j << 1] = temp;
}
else dp[(i + 1) & 1][j << 1] = 1;
}
}
int d = (ll)x * (size - 1) / 1000000;
printf("Case #%d: %.6f\n", f, dp[(m - 1)&1][d]);
}
return 0;
}