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 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 ≤ n ≤ 2 × 105) and a real number p (0 ≤ p ≤ 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

从两个箱子里取糖果,直到发现某一个箱子里的糖果已经取完,求另一个箱子里剩余糖果的期望。

因为取完的箱子选择了N+1次,故为p^(n+1),精度问题可以取对数处理。

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define LL __int64
#define N 400005
const LL mod=1000000007;
double f[N];
double logc(int m,int n)  //快速排列组合函数C(n,m)=exp(lggc(n,m));
{
    return f[m]-f[n]-f[m-n];
}
int main()
{
    double p,q;
    int n,i,k,cnt=1;
    f[0]=0;
    for(i=1;i<N;i++)
        f[i]=f[i-1]+log(i*1.0);
    while(~scanf("%d%lf",&n,&p))
    {
        q=1.0-p;
        double ans=0;
        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: %.6f\n",cnt++,ans);
    }
    return 0;
}
时间: 2024-12-25 10:16:53

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(组合+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 5698 瞬间移动(排列组合)

这题刚看完,想了想,没思路,就题解了 = = 但不得不说,找到这个题解真的很强大,链接:http://blog.csdn.net/qwb492859377/article/details/51478117 这个我只是看了他的思路,之后代码就自己写,之后交上去就是1A,我感觉好的题解就应该是这样的,Orz 要先看下他的思路,现在我在补充些我的理解: 首先,你要把行,列分开看,先说行,从1到n,1和n都不能走,因为1是开始,n是确定的,所以你有n-2种选择,你可以枚举x从1到n-2,就相当于高中学的

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): 1100Special Judge Problem DescriptionLazyChild is a lazy child who likes candy very much. Despite being very

hdu 2519 新生晚会 排列组合

通过阶段性计算减少一次性的大值计算 #include <stdio.h> int main() { int t, a, b, i; __int64 c; scanf("%d", &t); while(t--) { scanf("%d%d", &a, &b); if(a < b) printf("0\n"); else { c = 1; for(i = 1; i <= b; i++) c = c *

hdu 2519 新生晚会 排列组合基础

新生晚会 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9203    Accepted Submission(s): 3230 Problem Description 开学了,杭电又迎来了好多新生.ACMer想为新生准备一个节目.来报名要表演节目的人很多,多达N个,但是只需要从这N个人中选M个就够了,一共有多少种选择方法? Inpu

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

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

HDU - 1261-字串数 (排列组合+大数)

一个A和两个B一共可以组成三种字符串:"ABB","BAB","BBA". 给定若干字母和它们相应的个数,计算一共可以组成多少个不同的字符串. Input每组测试数据分两行,第一行为n(1<=n<=26),表示不同字母的个数,第二行为n个数A1,A2,...,An(1<=Ai<=12),表示每种字母的个数.测试数据以n=0为结束. Output对于每一组测试数据,输出一个m,表示一共有多少种字符串. Sample Inpu