时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
durong有a台iphonex和b台s8,并且放在一个保险箱里,durong现在一台一台从保险箱随机拿出这些手机,现在他想知道第k次拿出s8的概率是多少
输入描述:
第一行一个正整数T,表示数据组数。(1<=T<=10000) 接下来T行输入a,b,k 其中(1<=a,b,k<=1e9) k<=a+b;
输出描述:
第k次拿出s8的概率,保留三位小数
这是一道很有意思的题目,因为起初一看起来,就是一个数学概率题,似乎还不简单~
但是如果我们想到了抽签抓阄的话,那就好做了,这个和抽签抓阄的原理是一样的,不是吗?
所以放心大胆的得出概率是b/(b+a)。
当然,数学是严谨的,我们也得讲道理。
可以简单的证明一下,为什么概率还是b/(b+a)?
第一次拿到S8的概率:b/(b+a) 那么没拿到的概率就是 a/(b+a)
第二次计算时就要依据第一次拿没拿到的情况了:当第一次拿到和第一次没拿到,其概率为[b/(b+a)][(b-1)/(b+a-1)]+[a/(b+a][(b-1)/(b+a-1)] = b/(a+b),同理,第二次拿不到的概率[b/(b+a)][a/(b+a-1)]+[a/(b+a)][a/(b+a-1)] = a/(a+b),
同理,以此递推到第K次(k<b),概率都是如此,因为递推式一样。
这就说明前面拿不拿到S8对第K次拿S8是没有影响的。
| 第K次拿到S8 | 第K次没拿到S8 |
K = 1 | b/(a + b) | a/(a + b) |
K = 2 | b/(a + b) | a/(a + b) |
K = 3 | b/(a + b) | a/(a + b) |
K = n | b/(a + b) | a/(a + b) |
因此,理清了就很容易地AC了
#include <iostream>
using namespace std;
int main()
{
int t,a,b,k;
scanf("%d",&t);
while(t--)
{
scanf("%d %d %d",&a,&b,&k);
printf("%.3f\n",b*1.0/(a+b));
}
return 0;
}