uoj#399. 【CTSC2018】假面(概率期望)
记\(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$$
\]
于是操作\(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;
}
uoj#399. 【CTSC2018】假面(概率期望)的更多相关文章
- [CTSC2018]假面(概率DP)
考场上以为CTSC的概率期望题都不可做,连暴力都没写直接爆零. 结果出来发现全场70以上,大部分AC,少于70的好像极少,感觉血亏. 设a[i][j]表示到当前为止第i个人的血量为j的概率(注意特判血 ...
- UOJ #214 合唱队形 (概率期望计数、DP、Min-Max容斥)
9个月的心头大恨终于切掉了!!!! 非常好的一道题,不知为何uoj上被点了70个差评. 题目链接: http://uoj.ac/problem/214 题目大意: 请自行阅读. 题解: 官方题解讲得相 ...
- 洛谷 P4564 [CTSC2018]假面(期望+dp)
题目传送门 题意: 有 \(n\) 个怪物,第 \(i\) 个怪物初始血量为 \(m_i\).有 \(Q\) 次操作: 0 x u v,有 \(p=\frac{u}{v}\) 的概率令 \(m_x\) ...
- UOJ#299. 【CTSC2017】游戏 线段树 概率期望 矩阵
原文链接www.cnblogs.com/zhouzhendong/p/UOJ299.html 前言 不会概率题的菜鸡博主做了一道概率题. 写完发现运行效率榜上的人都没有用心卡常数——矩阵怎么可以用数组 ...
- BZOJ5340: [Ctsc2018]假面
BZOJ5340: [Ctsc2018]假面 https://lydsy.com/JudgeOnline/problem.php?id=5340 分析: 背包,只需要求\(g_{i,j}\)表示强制活 ...
- 【BZOJ-1419】Red is good 概率期望DP
1419: Red is good Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 660 Solved: 257[Submit][Status][Di ...
- uvalive 7331 Hovering Hornet 半平面交+概率期望
题意:一个骰子在一个人正方形内,蜜蜂在任意一个位置可以出现,问看到点数的期望. 思路:半平面交+概率期望 #include<cstdio> #include<cstring> ...
- OI队内测试一【数论概率期望】
版权声明:未经本人允许,擅自转载,一旦发现将严肃处理,情节严重者,将追究法律责任! 序:代码部分待更[因为在家写博客,代码保存在机房] 测试分数:110 本应分数:160 改完分数:200 T1: 题 ...
- 2016 多校联赛7 Balls and Boxes(概率期望)
Mr. Chopsticks is interested in random phenomena, and he conducts an experiment to study randomness. ...
- 牛客网多校赛第9场 E-Music Game【概率期望】【逆元】
链接:https://www.nowcoder.com/acm/contest/147/E 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...
随机推荐
- fragment 动态加载
/** * 测试使用Fragment(动态使用) 1. * 使用FragmentManager和FragmentTransaction动态使用一个Fragment 2. 方式: * add(viewI ...
- springcloud 研发规范
1) 程序结构规范 1: Facade-Stub:包含所有对外提供服务的借口定义,并对外提供 2: Façade:实现Façade-Stub里面定义的全部借口,可以调用Service模块和Commo ...
- springboot 默认tomcat配置
1. Spring Boot 能支持的最大并发量主要看其对Tomcat的设置,可以在配置文件中对其进行更改.当在配置文件中敲出max后提示值就是它的默认值. 我们可以看到默认设置中,Tomcat的最大 ...
- react-native 支持 gif 图片
只需要在android/app/build.gradle中的dependencies字段中添加: compile 'com.facebook.fresco:animated-gif:0.13.0' 然 ...
- <JAVA图像学习笔记>十字路口交通模拟--操作系统模拟课后小项目
项目的要求很简单: 模拟出十字路口的交通控制情况: 秒. 当东西(或南北)方向红灯时,所有车辆(除了消防车.救护车.警车)均排队等待,当东西(或南北)方向绿灯时,所有车辆按序行驶(不准超车). 制作这 ...
- c#使用itextsharp输出pdf(动态填充表单内容,显示中文)
相关链接: iText的简单应用-字体 c#程序为PDF文件填写表单内容 示例代码: static void Main(string[] args) { BaseFont font = BaseFon ...
- java进程分析
1. 找出 java进程pid,比如 11327 2. 使用jstack 看下 锁持有情况 /usr/java/latest/bin/jstack -l 11327 3. 输出java堆栈信息,以及 ...
- 用js实现图片(小球)在屏幕上上下左右移动
<html> <head> <title>Document</title> </head> <body style="bac ...
- Struts2 小例子 --第二弹
struts-2.5.14.1-all.zip 下载后文件夹说明 apps:war格式的例子文件 lib:引用jar包文件 src:源码文件 docs:帮助文档 小例子: 1.创建web工程:str ...
- JS 删除数组中指定的某个元素的方法
//首先创建函数方法 Array.prototype.indexOf = function(val){ for(var i=0;i<this.length;i++){ if(this[i] == ...