考场上以为CTSC的概率期望题都不可做,连暴力都没写直接爆零。

结果出来发现全场70以上,大部分AC,少于70的好像极少,感觉血亏。

设a[i][j]表示到当前为止第i个人的血量为j的概率(注意特判血量为0的情况)。那么a[i][0]则为这个人的死亡率。

设dp[i]表示当前指定集合中,有i个人存活的概率。

可以发现a[][]和是可以推导出dp[]的,直接DP可以得到70分。同时发现dp[]存在逆变换,所以复杂度就可以通过了。

但是如果写丑了还是会被卡掉,优化方法可以加快读,减少取模次数,以及预处理逆元。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define rep(i,l,r) for (int i=l; i<=r; i++)
 5 typedef long long ll;
 6 using namespace std;
 7
 8 const int N=210,mod=998244353;
 9 int n,K,Q,op,id,u,v,ans,h[N],s[N],inv[N],dp[N],dp1[N],a[N][N];
10
11 int rd(){
12     int x=0; bool t=0; char ch=getchar();
13     while (ch<'0' || ch>'9') t|=(ch=='-'),ch=getchar();
14     while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
15     if (t) return -x; else return x;
16 }
17
18 int ksm(int a,int b){
19     int res;
20     for (res=1; b; a=1ll*a*a%mod,b>>=1)
21         if (b & 1) res=1ll*res*a%mod;
22     return res;
23 }
24
25 int main(){
26     freopen("faceless.in","r",stdin);
27     freopen("faceless.out","w",stdout);
28     n=rd(); rep(i,1,n) h[i]=rd(),a[i][h[i]]=1;
29     inv[1]=1; rep(i,2,n) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
30     for (Q=rd(); Q--; ){
31         op=rd();
32         if (op==0){
33             id=rd(); u=rd(); v=rd(); int vv=ksm(v,mod-2);
34             a[id][0]=(a[id][0]+1ll*a[id][1]*u%mod*vv%mod)%mod;
35             rep(i,1,h[id])
36                 a[id][i]=(1ll*a[id][i]*(1-1ll*u*vv%mod+mod)+1ll*a[id][i+1]*u%mod*vv)%mod;
37         }else{
38             K=rd();
39             rep(i,1,K) dp[i]=0; dp[0]=1;
40             rep(i,1,K){
41                 s[i]=rd();
42                 for (int j=i; ~j; j--) dp[j]=(1ll*(1-a[s[i]][0]+mod)*dp[j-1]+1ll*a[s[i]][0]*dp[j])%mod;
43             }
44             rep(i,1,K){
45                 ans=0; rep(j,0,K) dp1[j]=0;
46                 if (!a[s[i]][0]) rep(j,0,K-1) ans=(ans+1ll*dp[j+1]*inv[j+1])%mod;
47                 else{
48                     int res=1; rep(j,1,K) if (j!=i) res=1ll*res*a[s[j]][0]%mod; dp1[0]=res;
49                     rep(j,0,K-1){
50                         if (j>0) dp1[j]=1ll*(dp[j]-1ll*(1-a[s[i]][0])*dp1[j-1]%mod+mod)%mod*ksm(a[s[i]][0]%mod,mod-2)%mod;
51                         ans=(ans+1ll*dp1[j]*inv[j+1])%mod;
52                     }
53                 }
54                 ans=1ll*ans*(1-a[s[i]][0]+mod)%mod; printf("%d ",ans);
55             }
56             puts("");
57         }
58     }
59     rep(i,1,n){
60         ans=0;
61         rep(j,1,h[i]) ans=(ans+1ll*j*a[i][j])%mod;
62         printf("%d ",ans);
63     }
64     puts("");
65     return 0;
66 }

转载于:https://www.cnblogs.com/HocRiser/p/9009730.html

[CTSC2018]假面(概率DP)相关推荐

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

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

  2. 2018.09.01 poj3071Football(概率dp+二进制找规律)

    传送门 概率dp简单题. 设f[i][j]表示前i轮j获胜的概率. 如果j,k能够刚好在第i轮相遇,找规律可以发现j,k满足: (j−1)>>(i−1)(j−1)>>(i−1) ...

  3. Discovering Gold LightOJ - 1030[概率dp或者记忆化搜索]

    题目大意:有一个[1,n][1,n][1,n]的数轴,数轴上的每个对应位置上都有金矿,你初始位置是1,然后你每次都会投色子决定你下一步跳到哪里,如果你跳出了nnn,那么你就要重新投.问你跳到nnn的时 ...

  4. 【原创】概率DP总结 by kuangbin

    概率DP主要用于求解期望.概率等题目. 转移方程有时候比较灵活. 一般求概率是正推,求期望是逆推.通过题目可以体会到这点. 首先先推荐几篇参考的论文: <信息学竞赛中概率问题求解初探> & ...

  5. poj 3071 Football(概率dp)

    http://poj.org/problem? id=3071 大致题意:有2^n个足球队分成n组打比赛.给出一个矩阵a[][],a[i][j]表示i队赢得j队的概率.n次比赛的流程像这样France ...

  6. HDU 5001 概率DP || 记忆化搜索

    2014 ACM/ICPC Asia Regional Anshan Online 给N个点,M条边组成的图,每一步能够从一个点走到相邻任一点,概率同样,问D步后没走到过每一个点的概率 概率DP  測 ...

  7. hdu 3853 LOOPS 概率DP

    简单的概率DP入门题 代码如下: 1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 ...

  8. HDU - 4035 Maze(概率dp)

    题目链接:点击查看 题目大意:给出一个 n 个点的树,初始时位于点 1 ,每个点都会给出一个概率 k[ i ] 和一个概率 e[ i ] ,其代表的意义分别是: k[ i ] :在点 i 有 k[ i ...

  9. SDUT - 2623 The number of steps(概率dp)

    题目链接:点击查看 题目大意:给出一个 n 层的三角形,第一层有 1 个点,第二层有 2 个点,第三层有 3 个点 ... 第 n 层有 n 个点,现在规定从第一层的点向下出发: 如果左下方有点并且右 ...

  10. 牛客练习赛26B 烟花 (概率DP)

    链接:https://ac.nowcoder.com/acm/contest/180/B 来源:牛客网 烟花 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5 ...

最新文章

  1. android 电量控件,Android实现显示电量的控件代码
  2. 网络营销重点之如何了解用户需求完善网络营销策略
  3. viewDidLoad, viewWillDisappear, viewWillAppear等区别及各自的加载顺序
  4. JavaScript 开发者年度调查报告(2016-01)
  5. 统计字符串中每种字符类型的个数demo
  6. 机器学习之琐碎知识(代码运行问题)
  7. javadocx转换成html_使用Java将Word转为Html或txt[转]
  8. 三分钟带你看懂prototype原型——ES6进阶
  9. MatLab imhist
  10. nds android7.0模拟器,nds最佳MD模拟器jEnesisDS 0.7更新
  11. 通过池塘配置ip实验
  12. Android校招复习资料整理
  13. html表格只设外边框,只设内边框
  14. 二次函数图像如何用计算机绘制,怎么在WPS表格中绘制二次函数曲线图
  15. 大数据之Hadoop3.x 运行环境搭建(手把手搭建集群)
  16. 仙人球模型matlab,3dmax软件如何制作带刺的仙人球模型?
  17. ProcessStartInfo处理方法
  18. 十二月份地支藏干强度表
  19. 比尔总动员技师职业详解
  20. PV、EV、AC、BAC、EAC、ETC等计算公式含义

热门文章

  1. linux 命令缺失安装,Redhat7没有安装ifconfig命令的解决方法
  2. java Random类和Math.Rondom
  3. Beyond Compare 4 智能比较工具、Everything 文件/夹搜索工具,WinRAR,7-Zip 解压缩工具、diagrams 流程图工具
  4. c# 如何抓微信把柄_抓住把柄表情包 - 抓住把柄微信表情包 - 抓住把柄QQ表情包 - 发表情 fabiaoqing.com...
  5. 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_6 自定义类型转换器代码编写
  6. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_6_函数式接口作为方法的返回值类...
  7. CentOS清除用户登录记录和命令历史方法
  8. IT部门域事件与业务分析
  9. 正确率、召回率和F值
  10. DDM:剪贴板处理处罚及截取屏幕