洛谷10月月赛 2 t2 深海少女与胖头鱼

题目链接

参考资料:洛谷10月赛2讲评ppt;

本篇题解考完那天就开始写,断断续续写到今天才写完

本题作为基础的期望dp题,用来学习期望dp还是很不错的

(说是期望dp,不如说是期望递推?)

另外,本题用到了模意义下的除法变乘法,这也是一个基础但重要的概念

1 算法分析

part 1

我们先来考虑\(m=0\)的情况,也就是说所有的胖头鱼都带有圣盾

\(f[i]\)表示有\(i\)条圣盾胖头鱼时的期望伤害次数,我们先击破一条胖头鱼的圣盾

变成\(i-1\)条圣盾胖头鱼,考虑下一步操作,当我们攻击那条不带圣盾的胖头鱼时

该胖头鱼死亡,发生的概率为\(\frac{1}{i}\)转移到\(f[i-1]\)的状态

当我们攻击带圣盾的胖头鱼时只不过是将该胖头鱼的圣盾换到了那条没带圣盾的胖头鱼身上

该操作的概率为\(\frac{i-1}{i}\)

将上面的思路总结一下,我们就得到了下面的式子

\[f[i]=1+\frac{1}{i}*f[i-1]+\frac{i-1}{i}*f[i]
\]

我们对它化简一下,就有了

\[f[i]=f[i-1]+i+1
\]

化简过程就是简单的去分母,移项

根据这个式子,利用递推就可以get到10point

代码如下

#include<iostream>
#define ll long long
#define mod 998244353
using namespace std;
int n,m;
ll f[1000000];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
f[i]=(f[i-1]+i+1)%mod;
}
cout<<f[n]%mod;
return 0;
}

part 2

我们再观察一下这个式子,这不就是等差数列吗?

直接\(O(1)\)求出答案 30point get

代码如下

#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
using namespace std;
ll n,m;
ll x,y;
void exgcd(ll a,ll b,ll &x,ll &y){
if(!b){
x=1;
y=0;
}
else{
exgcd(b,a%b,y,x);
y-=a/b*x;
}
}
int main(){
freopen("a.in","r",stdin);
cin>>n>>m;
ll p=998244353L;
exgcd(2,p,x,y);
x=(x%p+p)%p;
ll t=(n%p)*((n+3LL)%p)%p;
cout<<(t*x)%p;
return 0;
}

我们看到了个奇怪的东西exgcd,为什么我们要使用扩欧呢?

我们在这里用到了等差数列求和公式,里面出现了除法,我们要明白,

在模意义下,除法是不能直接除的,我们需要乘以除数的逆元,本部分用了2在%p意义下的逆

元,我们用扩欧求逆元

part 3

我们处理完了\(m=0\)的所有情况,我们来考虑\(m!=0\)的所有情况,

设\(g[i]\)为有n个圣盾胖头鱼,i个无圣盾胖头鱼的期望伤害次数

我们考虑执行攻击操作,若攻击到了无圣盾胖头鱼,该鱼死亡,进入到\(g[i-1]\)状态

该操作的概率为\(\frac{i}{n+i}\)

假设我们该操作攻击到了带圣盾胖头鱼,该胖头鱼圣盾破裂

但其余胖头鱼全部都具有了圣盾

进入了\(f[n+i]-1\)状态,为什么要-1?因为该状态和\(f[i+n]\)需要打破一个圣盾才能进入到目前状态

但不要忘了,我们最开始攻击胖头鱼是有一次操作的,需要+1,所以+1就和-1抵消掉了

该操作的可能性为\(\frac{n}{i+n}\)

归纳上述式子,得到了

\[g[i]=\frac{i}{n+i}*(g[i-1]+1)+\frac{n}{i+n}*f[n+i]
\]

\(f\)数组考虑用公式或者矩阵乘法进行优化

std写了矩阵乘法,我在此写了公式法

因为需要的逆元比较多,在此考虑费马小定理求逆元,具体细节可以自行百度

本题求逆元对时间复杂度的影响较大,我们可以提前算一些逆元,来降低时间复杂度(最开始就因为

这个,一直tle)

时间复杂度为

\(O(m log p)\)

\(p\)为模数

代码如下

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
#define maxn 2000000
using namespace std;
ll m,n;
ll mod =998244353;
ll power(ll x,ll t)
{
if(x==0) return 0;
x%=mod;
ll b=1;
while(t)
{
if(t&1) b=b*x%mod;
x=x*x%mod; t>>=1;
}
return b;
}
ll f(ll x){
ll t=(x%mod)*((x+3LL)%mod)%mod;
return (t*power(2,mod-2))%mod;
}
ll g[maxn];
ll ft[maxn];
int main(){
cin>>n>>m;
ll t=(n%mod)*((n+3LL)%mod)%mod;
g[0]=(t*power(2,mod-2))%mod;
n%=mod;
ll inv=power(2,mod-2);
for(int i=1;i<=m;i++){
int x=n+i;
ll t=(x%mod)*((x+3LL)%mod)%mod;
ft[i]=(t*inv)%mod;
}
for(int i=1;i<=m;i++){
inv=power(n+i,mod-2);
g[i]=((i*inv%mod*(g[i-1]+1)%mod)%mod+(n*inv%mod*ft[i]%mod)%mod)%mod;
}
cout<<g[m];
return 0;
}

完结撒花!!!

洛谷 p6858 深海少女与胖头鱼 洛谷月赛 期望dp的更多相关文章

  1. 洛谷 P4012 深海机器人问题【费用流】

    题目链接:https://www.luogu.org/problemnew/show/P4012 洛谷 P4012 深海机器人问题 输入输出样例 输入样例#1: 1 1 2 2 1 2 3 4 5 6 ...

  2. 【洛谷3648/BZOJ3675】[APIO2014]序列分割(斜率优化DP)

    题目: 洛谷3648 注:这道题洛谷3648有SPJ,要求输出方案.BZOJ3675数据组数较多但不要求输出方案. 分析: 这可能是我第三次重学斜率优化了--好菜啊 这道题首先一看就是个DP.稍微推一 ...

  3. 洛谷P4012 深海机器人问题(费用流)

    题目描述 深海资源考察探险队的潜艇将到达深海的海底进行科学考察. 潜艇内有多个深海机器人.潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动. 深海机器人在移动中还必须沿途采集海底生物标本.沿途生 ...

  4. 洛谷P4012 深海机器人问题(费用流)

    传送门 图给的好坑……还得倒过来…… 用大佬的图做个示范 我们考虑左图吧 把每一个点向下连边,容量$1$,费用为给出的价值(表示一个机器人可以过去取得标本) 再连一条边,容量$inf$,费用$0$(表 ...

  5. 洛谷 P4012 深海机器人问题 【最大费用最大流】

    和火星那个有点像,但是这个价值直接在路径上,不用拆点,对于每条价值为w的边(i,j),连接(i,j,1,w)(i,j,inf,0),表示价值只能取一次,然后连接源点和所有出发点(s,i,k,0),所有 ...

  6. 洛谷AT2046 Namori(思维,基环树,树形DP)

    洛谷题目传送门 神仙思维题还是要写点东西才好. 树 每次操作把相邻且同色的点反色,直接这样思考会发现状态有很强的后效性,没办法考虑转移. 因为树是二分图,所以我们转化模型:在树的奇数层的所有点上都有一 ...

  7. 洛谷4859 BZOJ3622 已经没什么好害怕的了(DP,二项式反演)

    题目链接: 洛谷 BZOJ 题目大意:有两个长为 $n$ 的序列 $a,b$,问有多少种重排 $b$ 的方式,使得满足 $a_i>b_i$ 的 $i$ 的个数比满足 $a_i<b_i$ 的 ...

  8. 洛谷P4608 [FJOI2016]所有公共子序列问题 【序列自动机 + dp + 高精】

    题目链接 洛谷P4608 题解 建个序列自动机后 第一问暴搜 第二问dp + 高精 设\(f[i][j]\)为两个序列自动机分别走到\(i\)和\(j\)节点的方案数,答案就是\(f[0][0]\) ...

  9. 最小生成树 & 洛谷P3366【模板】最小生成树 & 洛谷P2820 局域网

    嗯... 理解生成树的概念: 在一幅图中将所有n个点连接起来的n-1条边所形成的树. 最小生成树: 边权之和最小的生成树. 最小瓶颈生成树: 对于带权图,最大权值最小的生成树. 如何操作? 1.Pri ...

随机推荐

  1. matlab数字图像简单的加密方法

    图像加密的重要性可想而知,每个人都会有自己的小秘密,通过图像加密的方法可以保护自己的照片等的安全. 一般情况下,图像加密可以分为以下几个步骤: 1.选择图像加密算法 2.根据算法获取秘钥 3.根据保存 ...

  2. redis连接池参数动态化

    有的时候要从后端获取数据,真实的key可能在参数之上做一些修改,查了下set-misc模块,set_unescape_uri命令支持变量替换 location ~ /get_redis$ {      ...

  3. Spring系列 之数据源的配置 数据库 数据源 连接池的区别

    Spring系列之数据源的配置 数据源,连接池,数据库三者的区别 连接池:这个应该都学习过,比如c3p0,druid等等,连接池的作用是为了提高程序的效率,因为频繁的去创建,关闭数据库连接,会对性能有 ...

  4. 常见消息中间件之RocketMQ

    前言 RocketMQ是一款分布式.队列模型的消息中间件,由阿里巴巴自主研发的一款适用于高并发.高可靠性.海量数据场景的消息中间件.早期开源2.X版本名为MetaQ:2015年迭代3.X版本,更名为R ...

  5. Powershell编程基础-003-脚本的绝对路径及所在的目录

    在运行脚本的时候,有时候需要通过脚本文件所在目录路径来做一些事, 如脚本5201351.ps1脚本, 常规思路实现>>>>: 1.如果要获取这个脚本所在的绝对路径,可以使用内置 ...

  6. 关于KeePass基于csv格式的批量导入与导出

    在KeePass的导出选项中,有一个KeePass CSV(1.x),导出后格式如下: "Account","Login Name","Passwor ...

  7. 《zookeeper原理与实践》笔记

    第1章 分布式架构 1.1 分布式 分布式特点:分布性.对等性.并发性.缺乏全局时钟.故障总是会发生. 分布式问题:通讯异常.网络分区(脑裂).三态.节点故障.   1.2 ACID到CAP/BASE ...

  8. Linux基本命令学习

    对操作系统进行信息查询 硬盘大小 查看磁盘信息:  fdisk -l/dev/sda       操作系统中第一块硬盘的名称以及所在路径linux操作系统中一切皆文件(文件名)        sd(硬 ...

  9. 基础篇:深入JMM内存模型解析volatile、synchronized的内存语义

    目录 1 java内存模型,JMM(JAVA Memory Model) 2 CPU高速缓存.MESI协议 3 指令重排序和内存屏障指令 4 happen-before原则 5 synchronize ...

  10. Servlet3.x部署描述符

    简介 web.xml即部署描述符,位于WEB-INF目录下.在Servlet3以上版本有提供了注解的方式部署Servlet,因此web.xml是可选的.web.xml大概框架如下: <?xml ...