HDU5985 Lucky Conins 概率题
Lucky Conins
題意
最多共101010種硬幣,所有的硬幣之和不超過100000100000100000,每次將所有的硬幣拋出,第iii中硬幣正面朝上的概率為pip_ipi?,將反面朝上的硬幣移除掉.直至最后剩一種硬幣或沒有硬幣則停止.若最后剩余一種硬幣,則稱這種硬幣是幸運的,求每種硬幣的幸運概率.
題解
推公式題.
假設我們要求第iii種硬幣成為幸運硬幣的概率,那么我們可以求其在第xxx步成為幸運硬幣的概率,然后對xxx求和即可.
計算硬幣iii在xxx步成為幸運硬幣的概率:
一.第iii種硬幣,必須在第xxx步至少剩111個:
[1] : Alive[i,x]=1?(1?pix)ciAlive[i,x] = 1-(1-p_i^x)^{c_i}Alive[i,x]=1?(1?pix?)ci?
硬幣iii在第xxx步存活:pixp_i^xpix?,在第xxx步及之前死亡:1?pix1-p_i^x1?pix?,第iii種所有硬幣在第xxx步都死亡(1?pix)ci(1-p_i^x)^{c_i}(1?pix?)ci?,第iii種在第xxx步至少剩余一個硬幣1?(1?pix)ci1-(1-p_i^x)^{c_i}1?(1?pix?)ci?
二. 第jjj種硬幣,至少有一枚要在第x?1x-1x?1步存活,第xxx步死亡
先考慮對于第jjj種硬幣,它至少有一枚硬幣第x?1x-1x?1步存活,在第xxx步死亡的概率.
假設第jjj種有ttt枚硬幣在第x?1x-1x?1步存活,在第xxx步死亡:
Ccjt(pjx?1)t(1?pjx?1)cj?t(1?pj)t=Ccjt(pjx?1?pjx)t(1?pjx?1)cj?tC_{c_j}^t(p_j^{x-1})^t(1-p_j^{x-1})^{c_j-t}(1-p_j)^t = C_{c_j}^t(p_j^{x-1}-p_j^{x})^t(1-p_j^{x-1})^{c_j-t}Ccj?t?(pjx?1?)t(1?pjx?1?)cj??t(1?pj?)t=Ccj?t?(pjx?1??pjx?)t(1?pjx?1?)cj??t
對ttt從111到cjc_jcj?求和,利用二項式定理我們得到了第jjj種硬幣,它至少有一枚硬幣第x?1x-1x?1步存活,在第xxx步死亡的概率:
[2] : (1?pjx)cj?(1?pjx?1)cj(1-p_j^{x})^{c_j}-(1-p_j^{x-1})^{c_j}(1?pjx?)cj??(1?pjx?1?)cj?.
三.除第iii種之外的所有硬幣,至少有111枚在x?1x-1x?1步存活,在第xxx步死亡
為避免重復計算
設jjj是不與iii相等的數中最小的.
我們考慮是第jjj種硬幣起到了這個作用,那么jjj種以后的硬幣只要滿足在xxx步及之前死光即可.
然后再考慮是j+tj+tj+t種硬幣起到了這個作用,那么j+tj+tj+t種以后的硬幣只要滿足在xxx步及之前死光即可,并且要滿足第j+tj+tj+t種之前的硬幣必須不能起作用(即在x?1x-1x?1步及之前就必須全部死光),否則會算重.
也就是說我們需要記錄lft[j,x]lft[j,x]lft[j,x]表示jjj種之前的硬幣全部在第x?1x-1x?1步及之前就死光.記錄rgt[j,x]rgt[j,x]rgt[j,x]表示jjj種之后的硬幣全都在第xxx步及之前就死光.
其中lft[j,x]=∑t≠i,t<j(1?ptx?1)ctlft[j,x] = \sum_{t \ne i,t < j}(1-p_t^{x-1})^{c_t}lft[j,x]=∑t??=i,t<j?(1?ptx?1?)ct?,rgt[j,x]=∑t≠i,t>jn(1?ptx)ctrgt[j,x] = \sum_{t\ne i,t > j}^n(1-p_t^x)^{c_t}rgt[j,x]=∑t??=i,t>jn?(1?ptx?)ct?
那么這部分的答案就是
∑j≠i((1?pjx+1)cj?(1?pjx)cj)?lft[j,x]?rgt[j,x]\sum_{j \ne i}((1-p_j^{x+1})^{c_j}-(1-p_j^x)^{c_j})*lft[j,x]*rgt[j,x]∑j??=i?((1?pjx+1?)cj??(1?pjx?)cj?)?lft[j,x]?rgt[j,x]
四.最終公式
(1?(1?pix)ci)∑j≠i(((1?pjx)cj?(1?pjx?1)cj)?lft[j,x]?rgt[j,x])(1-(1-p_i^x)^{c_i})\sum_{j \ne i}(((1-p_j^{x})^{c_j}-(1-p_j^{x-1})^{c_j})*lft[j,x]*rgt[j,x])(1?(1?pix?)ci?)∑j??=i?(((1?pjx?)cj??(1?pjx?1?)cj?)?lft[j,x]?rgt[j,x])
代碼
#include <iostream> #include <algorithm> #include <cstring> #define pr(x) std::cout << #x << ':' << x << std::endl #define rep(i,a,b) for(int i = a;i <= b;++i)double p[11]; int cnt[11]; int n; const int lim = 50; double fastpow(double x,int n) {double res = 1.0;while(n) {if(n&1) res *= x;x *= x;n >>= 1; }return res; } double f(int id,int x) {return fastpow(1-fastpow(p[id],x),cnt[id]) - fastpow(1-fastpow(p[id],x-1),cnt[id]); }double calc(int i) {double ans = 0;rep(x,1,lim) {double res = 1-fastpow(1-fastpow(p[i],x),cnt[i]);double tmp = 0,lft = 1;rep(j,1,n) {if(j == i) continue;double rgt = 1;rep(t,j+1,n) {if(i == t) continue;rgt *= fastpow(1-fastpow(p[t],x),cnt[t]);}tmp += f(j,x)*lft*rgt;lft *= fastpow(1-fastpow(p[j],x-1),cnt[j]);}ans += res * tmp;}return ans; } int main() {int T;std::cin >> T;while(T--) {std::cin >> n;rep(i,1,n) {std::cin >> cnt[i] >> p[i];}if(n == 1) {printf("%.6f\n",1.0);continue;}rep(i,1,n) {if(i != 1) printf(" ");printf("%.6f",calc(i));}puts("");}return 0; }總結
以上是生活随笔為你收集整理的HDU5985 Lucky Conins 概率题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 系统重置中途出错的解决办法内部错误,请尝
- 下一篇: Wannafly 挑战赛27 题解