掷骰子题解(期望DP)
题目描述
一行有 N N N个格子,编号为 1 , 2 , … , N 1,2,\dots,N 1,2,…,N,你站在格子 1 1 1处。前 N − 1 N-1 N−1个格子中,每个格子中都有一枚特殊的骰子。第 i i i个格子上的骰子,标有 0 , 1 , … , A i 0,1,\dots,A_i 0,1,…,Ai这些数。你每到一个格子,就会掷一次骰子,如果骰子掷出为 y y y,你当前在 i i i号格子,那么你可以跳到第 i + y i+y i+y号格子。骰子上的每一个数都是等概率出现的。问你走到第 N N N个格子时,期望要丢多少次骰子?答案对 998244353 998244353 998244353取模。对期望的取模的操作为:期望是一个分数,你先化简分数,分子乘上分母关于 998244353 998244353 998244353的逆元,得到一个整数,输出该整数。
输入格式
第一行输出 n n n。第二行有 n − 1 n-1 n−1个数,为 A 1 , A 2 , … , A n − 1 A_1,A_2,\dots,A_{n-1} A1,A2,…,An−1
输出格式
输出答案
输入样例1
3
1 1
输出样例1
4
输出样例2
5
3 1 2 1
输出样例2
332748122
数据范围
2 ≤ N ≤ 2 ∗ 1 0 5 , 1 ≤ A i ≤ N − i ( 1 ≤ i ≤ N − 1 ) 2\leq N\leq 2*10^5,1\leq A_i\leq N-i(1\leq i\leq N-1) 2≤N≤2∗105,1≤Ai≤N−i(1≤i≤N−1)
题解
这是一道期望DP,设 f i f_i fi表示走到第 i i i个格子时期望要走多少次才能到第 N N N个格子, f N = 0 f_N=0 fN=0,可以列出转移式:
f i = ∑ j = i i + A i f j A i + 1 + 1 f_i=\frac{\sum\limits_{j=i}^{i+A_i}f_j}{A_i+1}+1 fi=Ai+1j=i∑i+Aifj+1
在第 i i i个格子,等概率到第 i i i到 i + A i i+A_i i+Ai个格子。但是,观察可得, f i f_i fi的转移式是包括 f i f_i fi本身的,所以我们需要做一些调整。两边同时减去 f i A i + 1 \frac{f_i}{A_i+1} Ai+1fi得
A i A i + 1 f i = ∑ j = i + 1 i + A i f j A i + 1 + 1 \frac{A_i}{A_i+1}f_i=\frac{\sum\limits_{j=i+1}^{i+A_i}f_j}{A_i+1}+1 Ai+1Aifi=Ai+1j=i+1∑i+Aifj+1
两边同时乘 A i + 1 A i \frac{A_i+1}{A_i} AiAi+1得
f i = ∑ j = i + 1 i + A i f j A i + A i + 1 A i f_i=\frac{\sum\limits_{j=i+1}^{i+A_i}f_j}{A_i}+\frac{A_i+1}{A_i} fi=Aij=i+1∑i+Aifj+AiAi+1
用前缀和维护 f f f数组,即可线性求解。
code
#include<bits/stdc++.h>
using namespace std;
int n;
long long mod=998244353,a[200005],f[200005],sum[200005];
long long mi(long long t,long long v){if(v==0) return 1;long long re=mi(t,v/2);re=re*re%mod;if(v&1) re=re*t%mod;return re;
}
int main()
{scanf("%d",&n);for(int i=1;i<n;i++){scanf("%lld",&a[i]);}for(int i=n-1;i>=1;i--){f[i]=(sum[i+1]-sum[i+a[i]+1]+mod)%mod;f[i]=(f[i]+a[i]+1)%mod;f[i]=f[i]*mi(a[i],mod-2)%mod;sum[i]=(sum[i+1]+f[i])%mod;}printf("%lld",f[1]);return 0;
}
掷骰子题解(期望DP)相关推荐
- LeetCode 1223. 掷骰子模拟(DP)
1. 题目 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[i](i 从 1 开始 ...
- LeetCode 1155. 掷骰子的N种方法(DP)
1. 题目 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数为 target,请你 ...
- LightOJ 1151 Snakes and Ladders (期望DP + 高斯消元)
Description 'Snakes and Ladders' or 'Shap-Ludu' is a game commonly played in Bangladesh. The game is ...
- 【bzoj4318】OSU! 期望dp
题目描述 osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: 一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1个长度为n的0 ...
- 【loj6342】跳一跳 期望dp
题目描述 一个人从 $1$ 开始向 $n$ 跳,在 $i$ 时会等概率跳到 $i,i+1,...,n$ 之一.求从 $1$ 跳到 $n$ 的期望步数. $n\le 10^7$ . 题解 期望dp傻逼题 ...
- Luogu P3251 [JLOI2012]时间流逝 期望dp
题面 题面 题解 期望\(dp\)好题! 今年\(ZJOI\)有讲过这题... 首先因为\(T\)只有\(50\),大力\(dfs\)后发现,可能的状态数最多只有\(20w\)左右,所以我们就可以大力 ...
- 【bzoj5197】[CERC2017]Gambling Guide 期望dp+堆优化Dijkstra
题目描述 给定一张n个点,m条双向边的无向图. 你要从1号点走到n号点.当你位于x点时,你需要花1元钱,等概率随机地买到与x相邻的一个点的票,只有通过票才能走到其它点. 每当完成一次交易时,你可以选择 ...
- leetcode - 1223. 掷骰子模拟
1223. 掷骰子模拟 有一个骰子模拟器会每次投掷的时候生成一个 111 到 666 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 iii 的次数不能超过 rollMax ...
- 【poj2096】Collecting Bugs 期望dp
题目描述 Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other materia ...
最新文章
- 【Angular4】英雄指南demo
- 转载:JAVA中获取项目文件路径
- java script w3c study notes
- java基础知识总结,绝对经典
- c语言折半查找递归程序,C语言数据结构中二分查找递归非递归实现并分析
- css3 线条出现动画效果,CSS3实现的线条波浪动画效果
- 【CyberSecurityLearning 6】IIS之WEB服务器和FTP服务器
- redis pool
- 前端框架Vue——vue-i18n ,vue项目中如何实现国际化,$t的用法
- 限免下载!揭秘你不知道的计算机“进化论”
- 必须掌握的Python技巧(一)
- 嵌入式基础面八股文——并发,同步,异步,互斥,阻塞,非阻塞的理解(2)
- Not a git repository (or any of the parent directories): .git
- 黑塞矩阵(海森矩阵,Hessian Matrix)与牛顿法最优化
- tcptracerte参数_CCNA安全题库
- 90后程序英雄季逸超
- 补单平台开发搭建源码_补单系统开发搭建IDEA导入jdk8源码学习(报错解决方案)
- Oracle数据库cmd登陆
- 软件测试入职工作流程
- android图片资源加密解密,[原创]cocos2d游戏图片资源解密