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 ...
随机推荐
- Java for LeetCode 091 Decode Ways
A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...
- SNMP服务安装 Centos6.8环境网络安装
概念: snmp是英文“Simple Network Management Protocol”的缩写,意为:简单网络管理协议. snmp是目前最常用的环境管理协议. snmp被设计成与协议无关的. s ...
- 吴恩达机器学习笔记(七) —— K-means算法
主要内容: 一.K-means算法简介 二.算法过程 三.随机初始化 四.二分K-means 四.K的选择 一.K-means算法简介 1.K-means算法是一种无监督学习算法.所谓无监督式学习,就 ...
- c#使用itextsharp输出pdf(动态填充表单内容,显示中文)
相关链接: iText的简单应用-字体 c#程序为PDF文件填写表单内容 示例代码: static void Main(string[] args) { BaseFont font = BaseFon ...
- Linux_学习_01_ 压缩文件夹
二.参考资料 1.Linux下压缩某个文件夹命令
- codeforces 558C C. Amr and Chemistry(bfs)
题目链接: C. Amr and Chemistry time limit per test 1 second memory limit per test 256 megabytes input st ...
- POJ3693Maximum repetition substring (循环节)(后缀数组+RMQ)
The repetition number of a string is defined as the maximum number R such that the string can be par ...
- div靠右浮动案例
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- MySQL-计算7月重新激活客户第二种方法_20161022
上周日休假去广西玩了一周,回来继续. (一)上次用的是取当月首单日期,往前推30天 代码比较繁琐 这次方法是借助变量 错行进行判断 一个用户上次最后一次下单时间和下次下单时间的时间差 也就是形成一个相 ...
- bzoj 4066: 简单题 K-D树
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4066 题解 我们把每次的修改操作都当作二维平面上多了一个权值点 对于每组询问可以看做求一 ...