看起来很简单的一道概率题,费了不少周折。还让其他同学推导了一下,不过都陷入了一个错误的思维,忽略的他们得到burger的概率是0.5,而不是1,所以直接算排列组合是错误的。
看了一下网上一位大牛的做法,才知道自己的想法一开始就错了TAT。这题直接算的话比较麻烦,因为不知道从第几个开始停止抛硬币。反过来算他们俩得到不同面包的概率比较简单。这样硬币就会从头抛到尾。所有的情况就是C(n/2-1, n-2),就是把n/2-1的面包分给前n-2个孩纸。没种情况是概率就是(0.5^n-2),所以a[n]=C(n/2-1, n-2)*(0.5^n-2)=C(n/2-1, n-2)*(2^2-n).
因为n最大为100000,直接算会超出范围,一边乘一边除也不行。所以要推导一下递归公式:
好简单的公式。= =!
代码:
/*
ID: czq1992
LANG: C++
TASK: 557 - Burger
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
double a[100010];
void get()
{
int i,j;
a[2]=1;
for(i=4;i<=100000;i+=2)
{
a[i]=a[i-2]*(i-3.0)/(i-2.0);
}
}
int main()
{
int n,t;
get();
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
printf("%.4f\n",1.0-a[n]);
}
return 0;
}