您的位置:首页 > 其它

HDOJ 题目4465 Candy(快速排列组合)

2014-12-12 20:38 253 查看

Candy

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 2238    Accepted Submission(s): 964
Special Judge


[align=left]Problem Description[/align]
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?
 

[align=left]Input[/align]
There are several test cases.

For each test case, there is a single line containing an integer n (1 ≤ n ≤ 2 × 105) and a real number p (0 ≤ p ≤ 1, with 6 digits after the decimal).

Input is terminated by EOF.
 

[align=left]Output[/align]
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.
 

[align=left]Sample Input[/align]

10 0.400000
100 0.500000
124 0.432650
325 0.325100
532 0.487520
2276 0.720000

 

[align=left]Sample Output[/align]

Case 1: 3.528175
Case 2: 10.326044
Case 3: 28.861945
Case 4: 167.965476
Case 5: 32.601816
Case 6: 1390.500000

 

[align=left]Source[/align]
2012 Asia Chengdu Regional Contest

 

[align=left]Recommend[/align]
liuyiding   |   We have carefully selected several similar problems for you:  5141 5140 5139 5138 5137 
题目大意:每个盒子都有n个糖,选择第一个箱子的概率是p,另一个是q。每次随机选择一个箱子并取一颗糖,若无糖可取,则换箱子。问换箱子的时候,另一个箱子的剩余糖数量的期望。而且不是一个箱子没有时的期望,而是一个箱子没有了,再取到这个箱子时的期望。
公式:


快速排列组合函数:C(n,m)=exp(lggc(n,m))
ac代码
#include<stdio.h>
#include<string.h>
#include<math.h>
double f[400005];
double logc(int n,int m)
{
return f
-f[m]-f[n-m];
}
int main()
{
double p,q;
int n,i,j,k,c=0;
f[0]=0;
for(i=1;i<400005;i++)
f[i]=f[i-1]+log(i*1.0);
while(scanf("%d%lf",&n,&p)!=EOF)
{
double ans=0;
q=1-p;
for(k=0;k<n;k++)
ans+=(n-k)*(exp(logc(n+k,k)+(n+1)*log(p)+k*log(q))+exp(logc(n+k,k)+(n+1)*log(q)+k*log(p)));
printf("Case %d: %.6lf\n",++c,ans);
}
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: