HDU4465 Candy
1096 ワード
标题:2つの箱があって、中には同じ数のキャンディが入っていて、毎回1つ目の箱から取る確率はpで、2つ目の箱から取るのは1-pで、1つの箱を持って、もう1つの箱にキャンディの数の期待を残します.
この問題を一目で見て確率DPだと思って、それから押して違うことに気づいて、とても良い数式ですが、その組み合わせ数が大きすぎて、求めることができません.そしてその後はありません.の
式はC(n+i,i)*(p^(n+1)*(1−p)^i+p^i*(1−p)^(n+1)*(n−i)である.
n+1次の理由は、1つの箱のn個を先に取ってから、もう一度取りに行ったところ、この箱がなくなったことに気づいて、別の箱の数を見たからです.
組み合わせ数が求まらない.すべて対数を取って求めることができます.の
この問題を一目で見て確率DPだと思って、それから押して違うことに気づいて、とても良い数式ですが、その組み合わせ数が大きすぎて、求めることができません.そしてその後はありません.の
式はC(n+i,i)*(p^(n+1)*(1−p)^i+p^i*(1−p)^(n+1)*(n−i)である.
n+1次の理由は、1つの箱のn個を先に取ってから、もう一度取りに行ったところ、この箱がなくなったことに気づいて、別の箱の数を見たからです.
組み合わせ数が求まらない.すべて対数を取って求めることができます.の
#include
#include
#include
#include
using namespace std;
const int MAXN=200010;
double A[MAXN<<1];
void init()
{
int i;
A[0]=0;
for(i=1;i<=400010;i++)
{
A[i]=A[i-1]+log(i*1.0);
}
}
double logc(int n,int m)
{
return A[n]-A[m]-A[n-m];
}
int main()
{
int n,i,flag=1;
double p;
init();
while(scanf("%d%lf",&n,&p)==2)
{
double p1=log(p);
double p2=log(1-p);
double ans=0;
for(i=0;i