hdu 4465 Candy(log压缩大数)
2014-11-11 20:43
253 查看
期望公式很好推,要注意空的盒子总共被取了N+1次,而不是N次。
但是在N很大的时候公式中的组合数会巨大,而且p的N次方也会非常小。这样就要像一个方法压缩他们,就是对这些数取log,然后再用exp函数还原(e的n次方)
对于组合数,先预处理出1到2e5这些数阶乘的log,再用这些阶乘去算组合数。
对于p的n次方,它的log等于n*log(p)
代码:
但是在N很大的时候公式中的组合数会巨大,而且p的N次方也会非常小。这样就要像一个方法压缩他们,就是对这些数取log,然后再用exp函数还原(e的n次方)
对于组合数,先预处理出1到2e5这些数阶乘的log,再用这些阶乘去算组合数。
对于p的n次方,它的log等于n*log(p)
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #include <cmath> #define maxn 400005 double F[maxn]; double C[maxn]; int N; double p; void init(){ for(int i=2;i<=maxn;i++){ F[i]=F[i-1]+log(i); } } double Pow(double p,int n){ double res=1; while(n--) res*=p; return res; } int main(){ init(); int kase=1; while(~scanf("%d%lf",&N,&p)){ for(int i=0;i<N;i++){ C[i]=F[i+N]-F[i]-F ; } double res=0; double k1=log(p),k2=log(1-p); for(int i=0;i<N;i++){ double tmp; tmp=(N+1)*k1+i*k2+C[i]; res+=(N-i)*exp(tmp); tmp=(N+1)*k2+i*k1+C[i]; res+=(N-i)*exp(tmp); } printf("Case %d: %.6f\n",kase++,res); } return 0; }
相关文章推荐
- hdu 4465 Candy - 概率 log 组合数
- hdu 4465 Candy - 概率 log 组合数
- hdu 4465 Candy 数学期望 负二项分布与 数值计算技巧
- hdu 4465 Candy (概率期望)
- hdu 4465 Candy (快速排列组合 )
- [概率+对数优化] hdu 4465 Candy
- HDU 4465 HDOJ Candy 2012ACM亚洲赛成都赛区B题
- HDU 4465 Candy(组合+log优化)
- hdu 4465 Candy 组合数(快速排列组合)
- hdu 4465 Candy(二次项概率)
- hdu 4465 求期望(C(m,n)太大用log优化)
- hdu 4465 Candy 数学
- Hdu 4465 Candy (概率 对数 组合数 负二项分布)
- hdu 4465 Candy
- hdu 4465 Candy(2012 ACM-ICPC 成都现场赛)
- hdu 4465 Candy 快速全排列
- hdu 4465 Candy
- HDU 4465 - Candy(概率与数学优化)
- hdu 4465 Candy
- hdu 4465 Candy