#include <stdio.h>
double data[2][1001]; // for front/back
int main()
{
int T, test_case, no, max, temp;
double front, back, stay; // front(go left), back(go right)
double answer;
int i, j;
freopen("test.txt", "r", stdin);
setbuf(stdout, NULL);
scanf("%d", &T);
for (test_case = 1; test_case <= T; test_case++)
{
answer = 0;
// 첫 줄에 N(no), L(front), R(back)이 주어진다. (1 ≤ N ≤ 1000, 0 ≤ L, R ≤ 1, 0 ≤ L+R ≤ 1)
// condition1) 이 때, 동전의 앞 면과 뒷 면이 나올 확률이 다를 수도 있고,
// condition2) 심지어는 옆 면이 나올 수도 있음에 유의하자. (동전의 옆 면이 나오는 경우 이동하지 않는다.)
scanf("%d %lf %lf", &no, &front, &back);
stay = 1 - front - back;
data[0][0] = front + stay;
data[0][1] = back;
max = 1;
for (i = 1; i < no; ++i)
{
temp = (i - 1) % 2; // do modular operation
data[i % 2][0] = data[temp][0] * (stay + front) + data[temp][1] * front; // front case
for (j = 1; j < max; ++j) // handle back, stay, and front cases
data[i % 2][j] = data[temp][j - 1] * back + data[temp][j] * stay + data[temp][j + 1] * front;
data[i % 2][max] = data[temp][max - 1] * back + data[temp][max] * stay; // back case
data[i % 2][++max] = data[temp][max - 1] * back; // ++max for next number case
}
double prev_answer = 0;
for (i = 0; i <= max; ++i) {
answer += i * data[(no - 1) % 2][i];
#if 0
if (prev_answer == 0) prev_answer = answer;
if (prev_answer != answer && double(0.00000001 * 0) < (data[(no - 1) % 2][i])) {
printf("DEBUG: prev_answer(%lf), answer(%.3lf) += %4d * %lf \n", \
prev_answer, answer, i, (data[(no - 1) % 2][i]));
prev_answer = answer;
}
#endif
}
//if (test_case == 1)
printf("#%d %.3lf\n", test_case, answer);
//else
//printf("#%d %.3lf\n", test_case, 555);
}
return 0;
}
댓글