传送门

记\(p_{i,j}\)为\(i\)还剩\(j\)滴血的概率,那么\(i\)最后血量的期望就是\[E_i=\sum_{j=0}^{m_i}j\times p_{i,j}\]
然后\(p\)数组也很好转移,记这一次\(i\)收到伤害的概率为\(q\),那么转移方程为\[p'_{i,0}=p_{i,0}\times q\]
\[p'_{i,j}=p_{i,j+1}\times q+p_{i,j}\times (1-q)\]
于是操作\(1\)就解决了

然后考虑操作\(2\)是个什么玩意儿

记\(px_i\)为\(i\)还活着的概率,那么\(px_i=1-p_{i,0}\)

那么选到\(i\)的概率就是\[px_i\times \sum_{j=0}^{k-1}\frac{f_j}{j+1}\]
总共有\(k\)个人,枚举剩下还活着几个,\(f_j\)为除\(i\)外还有\(j\)个人活着的概率

设\(g_i\)为这\(k\)个人中任意活着\(i\)个人的概率,那么我们可以枚举每一个人\(x\),那么\(g\)也很容易转移\[g'_i=px_x\times g_{i-1}+(1-px_x)\times g_i\]
那么对于\(i\),\(f\)也很容易计算了\[f_j=\frac{g_j-px_i\times f_{j-1}}{1-px_i}\]
边界条件为\(f_0=\frac{g_0}{1-px_i}\)

可以这么理解,除了\(i\)之外还活了\(j\)个人的情况,就是总共活了\(j\)个人的情况,减去这\(j\)个人里面有\(i\)的情况,然而现在算出来的概率里面\(i\)是必死的,要除掉

总的复杂度为\(O(Qm+Cn^2)\)

//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
inline int min(const R int &x,const R int &y){return x<y?x:y;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){R int res,f=1;R char ch;while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');return res*f;
}
const int N=205,P=998244353;
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){R int res=1;for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);return res;
}
char sr[1<<21],z[20];int C=-1,Z=0;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
void print(R int x){if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;while(z[++Z]=x%10+48,x/=10);while(sr[++C]=z[Z],--Z);sr[++C]=' ';
}
int f[N],g[N],w[N],px[N],inv[N],p[N][N];
int Inv(R int x){return x<N?inv[x]:1ll*(P-P/x)*Inv(P%x)%P;}
int n,m,q,op,x,a,b,res;
int main(){
//  freopen("testdata.in","r",stdin);n=read();fp(i,1,n)w[i]=read(),p[i][w[i]]=1;inv[0]=inv[1]=1;fp(i,2,N-1)inv[i]=1ll*(P-P/i)*inv[P%i]%P;q=read();while(q--){op=read();if(op==0){x=read(),a=read(),b=read();a=mul(a,Inv(b)),b=dec(1,a);p[x][0]=add(p[x][0],mul(p[x][1],a));fp(i,1,w[x])p[x][i]=add(mul(p[x][i+1],a),mul(p[x][i],b));}else{m=read();fp(i,1,m)x=read(),px[i]=dec(1,p[x][0]),g[i]=0;g[0]=1;fp(i,1,m)fd(j,i,0)g[j]=add(j?mul(px[i],g[j-1]):0,mul(dec(1,px[i]),g[j]));fp(i,1,m){if(!px[i]){print(0);continue;}if(px[i]==1)fp(j,0,m-1)f[j]=g[j+1];else{x=Inv(dec(1,px[i])),f[0]=mul(g[0],x);fp(j,1,m-1)f[j]=mul(dec(g[j],mul(f[j-1],px[i])),x);}fp(j,0,m-1)res=add(res,mul(f[j],inv[j+1]));print(mul(res,px[i]));res=0;}sr[C]='\n';}}fp(i,1,n){res=0;fp(j,1,w[i])res=add(res,mul(j,p[i][j]));print(res);}return Ot(),0;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/10267200.html

uoj#399. 【CTSC2018】假面(概率期望)相关推荐

  1. UOJ #214 合唱队形 (概率期望计数、DP、Min-Max容斥)

    UOJ #214 合唱队形 (概率期望计数.DP.Min-Max容斥) 9个月的心头大恨终于切掉了!!!! 非常好的一道题,不知为何uoj上被点了70个差评. 题目链接: http://uoj.ac/ ...

  2. P4564 [CTSC2018]假面(期望)

    P4564 [CTSC2018]假面 首先容易看出结界技能对第二问敌方剩余生命值期望没有影响. 如何求出第iii个人的剩余生命值期望? 只需要根据Ei=∑j=0aij×fi,jE_i=\sum_{j= ...

  3. 第十一届山东省大学生程序设计竞赛 L. Construction of 5G Base Stations(概率期望,递推前缀和优化)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 第十一届山东省大学生程序设计竞赛 L. Construction of 5G Base Station ...

  4. 多元统计分析-概率,期望,方差,正态分布

    概率,期望,方差 只有一个变量时 F(x<=a) = ∫-∞af(x)dx 当区间取负无穷到正无穷时积分为1 推广到多元之后: 同理,当区间取满整个空间时,积分为1 f被称为概率密度函数 边缘分 ...

  5. loj#2542 [PKUWC2018]随机游走 (概率期望、组合数学、子集和变换、Min-Max容斥)

    loj#2542 [PKUWC2018]随机游走 (概率期望.组合数学.子集和变换.Min-Max容斥) 很好很有趣很神仙的题! 题目链接: https://loj.ac/problem/2542 题 ...

  6. [2020多校A层11.22]party(概率期望/近似)

    [2020多校A层11.22]party 非常巧妙的一个概率期望问题,其实运用的还是近似的思想 现在有n个物品,每次一个人有pi的概率选中这个物品,然后可以进行猜测,但是无论是否猜中都继续游戏,直到所 ...

  7. 概率期望题(期望 DP)做题记录

    概率期望题(期望 DP)做题记录 P3830 [SHOI2012]随机树 难点在于第二问:生成树的期望深度. 不 wei zhuo 捏,设 \(dp_{i,j}\) 表示已经有了 \(i\) 个叶子结 ...

  8. 【loj6191】「美团 CodeM 复赛」配对游戏 概率期望dp

    题目描述 n次向一个栈中加入0或1中随机1个,如果一次加入0时栈顶元素为1,则将这两个元素弹栈.问最终栈中元素个数的期望是多少. 输入 一行一个正整数 n . 输出 一行一个实数,表示期望剩下的人数, ...

  9. UVA11427概率期望+独立重复事件

    1 /*UVA11427*/ 2 /*概率期望: 3 独立重复事件A(p,n): 4 p:一件事情发生的概率为p 5 n:最多重复n次 6 要求:1.q=成功次数/实验次数>p 结束实验: 7 ...

  10. 【概率期望】【NOIP模拟】切题

    [题目描述] Alice 出了 n 场比赛,第i场比赛有ai道题. 由于是提高组模拟赛,因此最多只会有三题. Bob 要来切这些题.由于他艺高人胆大,所以他的切题方式比较特别. Bob 从 1到 n这 ...

最新文章

  1. ORACLE 查询约束
  2. inject 响应式_vue 的 provide 和 inject 依赖注入与 $parent
  3. 在Oracle中实现自增加ID的功能
  4. Python 解释器
  5. Qt文档阅读笔记-Widgets Tutorial官方解析及实例
  6. Json(四):Json增、删、改
  7. Android 8.0(29)---Android 8.0 获取当前的activity
  8. c语言中变量可以用x1表示没,你必须知道的495个C语言问题 读书笔记
  9. java list 之详解_java集合(二)List集合之ArrayList详解
  10. 计算机报名登录服务器超时,登录服务器超时
  11. 【ES系列五】——集群搭建(多机集群单机多节点集群)
  12. Qt-添加软件图标(logo)
  13. Idea 文件定位图标显示与关闭 -- idea ver:2020.1
  14. Android程序员该如何进阶学习以预防35岁中年职场危机?
  15. OpenGL光源位置
  16. 基于深度学习的图像隐写分析综述 阅读
  17. JavaScript、Lua语言基础、电脑脚本、手机免ROOT免越狱脚本开发免费视频教程
  18. 你离真正的全栈开发人员只差学会 Electron
  19. win11安卓子系统_win11系统运行安卓子系统教程
  20. 【C语言】结构体、共用体、位域

热门文章

  1. python 匹配整数或者小数(包括正数和负数)(简单易懂,代码可以直接运行)
  2. android 字母验证码,简单实现Android验证码
  3. Linux 离线安装 FTP客户端
  4. Wifi WCN36X0 芯片技术总结
  5. 投影矩阵之z坐标推导
  6. java课程设计日历记事本_《Java程序设计》课程设计日历记事本.doc
  7. pymssql连mysql_Python利用pymssql访问mysql数据库
  8. 一行代码,让你变得有钱
  9. 视频画质增强器--v1.0
  10. 基于Web的电子商城销售系统