HDU 4465 Candy

Candy

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2520    Accepted Submission(s): 1100
Special Judge

Problem Description
LazyChild is a lazy child who likes candy very much. Despite being very young, he has two large candy boxes, each contains n candies initially. Everyday he chooses one box and open it. He chooses the first box with probability p and the second box with probability (1 - p). For the chosen box, if there are still candies in it, he eats one of them; otherwise, he will be sad and then open the other box.
He has been eating one candy a day for several days. But one day, when opening a box, he finds no candy left. Before opening the other box, he wants to know the expected number of candies left in the other box. Can you help him?

Input
There are several test cases.
For each test case, there is a single line containing an integer $n (1 \leq n \leq 2 \times 10^5) $and a real number p ($0\leq p \leq 1$, with 6 digits after the decimal).
Input is terminated by EOF.

Output
For each test case, output one line “Case X: Y” where X is the test case number (starting from 1) and Y is a real number indicating the desired answer.
Any answer with an absolute error less than or equal to 10-4 would be accepted.

Sample Input

10 0.400000

100 0.500000

124 0.432650

325 0.325100

532 0.487520

2276 0.720000

Sample Output

Case 1: 3.528175

Case 2: 10.326044

Case 3: 28.861945

Case 4: 167.965476

Case 5: 32.601816

Case 6: 1390.500000

Source

2012 Asia Chengdu Regional Contest

解题:公式题

首先可以算出公式

\[\sum_{i = 0}^{n-1}\binom{n}{n+i}\times (p^{n+1}\times (1-p)^i + (1-p)^{n+1}\times p^i)\times (n-i)\]

我们至少要拿n个,才会出现一个盒子里面的糖果空,所以假设第一个为空,枚举第二个盒子剩余的糖果数量,或者假设第二个盒子为空,枚举第一个盒子剩余的糖果数量。

但是,更加狗血的事情发生了,会导致double溢出,你说用long double啊?呵呵,naive!还是要溢出,日了整个世界,好吧,使用log吧。换成对数,把*变成+

算$\binom{n}{n+i}$ 是可以滚动着算的

可以发现在取对数后有:

$$C_{0} = 0,C_i = C_{i-1} + log(n + i) - log(i)$$

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int main() {
 4     int n,cs = 1;
 5     double p;
 6     while(~scanf("%d%lf",&n,&p)) {
 7         double ret = 0,tmp,c = 0,logp = log(p),log_p = log(1 - p);
 8         for(int i = 0; i < n; ++i) {
 9             double logn_i = log(n-i);
10             tmp = c + (n + 1)* logp + i*log_p + logn_i;
11             ret += exp(tmp);
12             tmp = c + (n + 1)*log_p + i*logp + logn_i;
13             ret += exp(tmp);
14             c += log(n + i + 1.0) - log(i + 1.0);
15         }
16         printf("Case %d: %.6f\n",cs++,ret);
17     }
18     return 0;
19 }

时间: 2024-10-24 05:52:43

HDU 4465 Candy的相关文章

Hdu 4465 Candy (快速排列组合+概率)

题目链接: Hdu 4465 Candy 题目描述: 有两个箱子,每个箱子有n颗糖果,抽中第一个箱子的概率为p,抽中另一个箱子的概率为1-p.每次选择一个箱子,有糖果就拿走一颗,没有就换另外一个箱子.问换箱子的时候,另外一个箱子中剩下糖果的期望值. 解题思路: 注意题目描述,其中任意一个箱子没有糖果,另一个箱子中剩下糖果个数的期望,而不是第一个箱子没有糖果.不是把其中一个箱子取空时,另一个箱子剩下糖果的期望,而是其中一个箱子取空再换另外一个箱子时,这个箱子的期望. 可以根据期望性质画出公式:an

hdu 4465 Candy 2012 成都现场赛

1 /** 2 对于大数的很好的应用,,缩小放大,,保持精度 3 **/ 4 #include <iostream> 5 #include <cmath> 6 #include <algorithm> 7 #include <cstdio> 8 using namespace std; 9 10 int main() 11 { 12 double n,p; 13 int cnt =1; 14 while(cin>>n>>p){ 15

hdu 4465 Candy (快速排列组合 )

Candy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2115    Accepted Submission(s): 910 Special Judge Problem Description LazyChild is a lazy child who likes candy very much. Despite being ve

HDU 4465 Candy(组合+log优化)

题目大意:给你两个罐子,里面有糖果每次只能从一个罐子里面取一个糖果,打开A的概率为p,问当一个罐子取完之后,另一个罐子剩糖果的期望是多少. 我们可以知道最少是取第n+1次的时候才会有一个罐子为空,我们可以推出组合公式: (n-k)*C(n+k, k)*((1-p)^(n+1)*p^k+(1-p)^k*p^(n+k)):0 <= k && k <= n-1. 求一个和就是所有的组合情况了,但是组合数很大我们可以用log来进行优化. 我们已知:C(n,m) = m!/n!/(m-n

[概率+对数优化] hdu 4465 Candy

题意: 给两个盒子里面都有n个糖果,每次从第一个盒子里拿糖果的概率是p,另一个是1-p 问当拿完一个盒子时,另一个盒子还有多少糖果的期望. 其中有一点就是,当她打开盒子发现是空的时候 会去打开另一个盒子在同一天. 思路: 期望公式很好推: 但是推完就会出现各种溢出问题 所以要用对数优化 代码: #include"cstdlib" #include"cstdio" #include"cstring" #include"cmath"

hdu 5291 Candy Distribution(dp)

题目链接:hdu 5291 Candy Distribution 每次先计算出dp[0],然后根据dp[0]的数值可以用o(1)的复杂度算出dp[1],以此类推.总体复杂度为o(200 * 80000),可以接受. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 80000; const int maxm = 205; cons

HDU 1034 Candy Sharing Game 模拟题

一个分糖游戏,找了会规律,没找到,只能直接模拟玩了. 果然0ms过了,看来数据不大,只是考编码能力罢了. #include <stdio.h> #include <vector> #include <string.h> #include <algorithm> #include <iostream> #include <string> #include <limits.h> #include <stack> #

HDU 4780 Candy Factory

Candy Factory Time Limit: 2000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID: 478064-bit integer IO format: %I64d      Java class name: Main A new candy factory opens in pku-town. The factory import M machines to produce hig

hdu 1034 Candy Sharing Game

Candy Sharing Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4942    Accepted Submission(s): 3020 Problem Description A number of students sit in a circle facing their teacher in the cente