loj2513 治疗之雨
题意:你的英雄一开始血量为p,你还有m个队友,血量无穷。血量上限为n,下限为0。如果血量满了就不能加血。每次启动操作,随机给m+1个英雄加1点血,然后等概率随机k次每次对于英雄扣1点血。求期望操作几次你的英雄没血?
n,m,p<=1500.
标程:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+;
const int N=;
int n,p,m,k,f[N],inv[N],g[N][N],ans[N];
int ksm(int x,int y)
{
int res=;
while (y) {if (y&) res=(ll)res*x%mod; y>>=;x=(ll)x*x%mod;}
return res;
}
int Inv(int x){return ksm(x,mod-);}
void gauss()
{
for (int i=n;i>=;i--)
{
if (g[i][i]==&&g[i-][i]==) {puts("-1");return;}
if (g[i][i]==)
{
for (int j=;j<=i;j++) swap(g[i][j],g[i-][j]);
swap(g[i][n+],g[i-][n+]);
}
else
{
if (!g[i-][i]) continue;
int v=(ll)g[i-][i]*Inv(g[i][i])%mod;
for (int j=;j<=i;j++)
g[i-][j]=((ll)g[i-][j]-(ll)g[i][j]*v%mod+mod)%mod;
g[i-][n+]=((ll)g[i-][n+]-(ll)g[i][n+]*v%mod+mod)%mod;
}
}
for (int i=;i<=p;i++)
{
ans[i]=g[i][n+];
for (int j=;j<i;j++)
ans[i]=((ll)ans[i]-(ll)ans[j]*g[i][j]%mod+mod)%mod;
ans[i]=(ll)ans[i]*Inv(g[i][i])%mod;
if (!ans[i]) {puts("-1");return;}
}
printf("%d\n",ans[p]);
}
void init()
{
memset(g,,sizeof(g));
int tmp=,c=,in,inn;in=inn=Inv(m+);
for (int i=;i<=min(n,k);i++)
{
c=(ll)c*(k-i+)%mod*inv[i]%mod;
tmp=(ll)tmp*in%mod;
f[i]=(ll)c*tmp%mod;
}
in=(ll)m*in%mod;tmp=ksm(in,k-min(n,k));
f[]=;
for (int i=min(n,k);i>=;i--)
f[i]=(ll)f[i]*tmp%mod,tmp=(ll)tmp*in%mod; for (int i=;i<=n;i++)
{
if (i==n) in=,inn=;
for (int j=max(i-k,);j<=i;j++)
{
g[i][j]=((ll)g[i][j]+(ll)f[i-j]*in%mod)%mod;
if (j+<=n) g[i][j+]=(ll)f[i-j]*inn%mod;
}
g[i][i]=((ll)g[i][i]-+mod)%mod;g[i][n+]=mod-;
}
}
int main()
{
int T;scanf("%d",&T);
inv[]=inv[]=; for (int i=;i<=;i++) inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
while (T--) {
scanf("%d%d%d%d",&n,&p,&m,&k);
init();gauss();
}
return ;
}
易错点:1.注意对无解的特判,如果有概率为0就是-1。
题解:dp+高斯消元
一般dp式子:dp[i]表示还剩下i滴血直到英雄死去的期望操作次数。分自己的英雄是否加血讨论。f[i]表示血量减少i的概率,可以预处理。
$dp[i]=(\sum_{j=i-k}^{i}dp[j]*f[i-j]*m/(m+1)+\sum_{j=i-k+1}^{i+1}dp[j]*f[i+1-j]*1/(m+1))+1$。
但是由于有dp[i+1],难以递推。考虑设未知数进行高斯消元。高斯消元不是n^3*logn的吗?
由于这个矩阵写出来是阶梯状往右,第i行的最右边元素只到i+1,所以只用下面一行来减去它,化成右下三角矩阵求即可。时间复杂度O(n^2(*logn))。
或者直接用前n-1个式子写出dp[i]=Ax+B的表达式,然后再全部代入最后一个dp[n]=....的式子中,解Ax+B=A'x+B'即可。
loj2513 治疗之雨的更多相关文章
- 【BZOJ5292】[BJOI2018]治疗之雨(高斯消元)
[BZOJ5292][BJOI2018]治疗之雨(高斯消元) 题面 BZOJ 洛谷 题解 设\(f[i]\)表示剩余\(i\)点生命时的期望死亡的次数. 考虑打\(k\)次下来脸上被打了\(i\)下的 ...
- BZOJ5292 & 洛谷4457 & LOJ2513:[BJOI2018]治疗之雨——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5292 https://www.luogu.org/problemnew/show/P4457 ht ...
- 【LOJ2513】「BJOI2018」治疗之雨
题意 你现在有 \(m+1\) 个数:第一个为 \(p\) ,最小值为 \(0\) ,最大值为 \(n\) :剩下 \(m\) 个都是无穷,没有最小值或最大值.你可以进行任意多轮操作,每轮操作如下: ...
- 【LOJ】#2513. 「BJOI2018」治疗之雨
题解 具体就是列一个未知数方程\(dp[i]\)表示有\(i\)滴血的时候期望多少轮 \(dp[i] = 1 + \sum_{j = 1}^{i + 1} a_{i,j}dp[j]\) \(dp[n] ...
- [BZOJ5292][BJOI2018]治疗之雨(概率DP+高斯消元)
https://blog.csdn.net/xyz32768/article/details/83217209 不难找到DP方程与辅助DP方程,发现DP方程具有后效性,于是高斯消元即可. 但朴素消元显 ...
- luoguP4457 [BJOI2018]治疗之雨 概率期望 + 高斯消元
应该是最后一道紫色的概率了....然而颜色啥也代表不了.... 首先看懂题意: 你现在有$p$点体力,你的体力上限为$n$ 在一轮中, 1.如果你的体力没有满,你有$\frac{1}{m + 1}$的 ...
- [BJOI2018]治疗之雨
题目 我还没疯 发现如果我们将血量抽象成点,一轮操作抽象成图上的一条边,我们如果能求出每一条边的概率,我们就能搞一下这道题 假设我们求出了这个图\(E\),设\(dp_i\)表示从\(i\)点到达\( ...
- [BZOJ5292] [BJOI2018]治疗之雨
题目链接 BZOJ:https://lydsy.com/JudgeOnline/problem.php?id=5292 洛谷:https://www.luogu.org/problemnew/show ...
- 洛谷P4457/loj#2513 [BJOI2018]治疗之雨(高斯消元+概率期望)
题面 传送门(loj) 传送门(洛谷) 题解 模拟赛的时候只想出了高斯消元然后死活不知道怎么继续--结果正解居然就是高斯消元卡常? 首先有个比较难受的地方是它一个回合可能不止扣一滴血--我们得算出\( ...
随机推荐
- ionic-CSS:ionic checkbox(复选框)
ylbtech-ionic-CSS:ionic checkbox(复选框) 1.返回顶部 1. ionic checkbox(复选框) ionic 里面的 Checkbox 和普通的 Checkbox ...
- xslt数值的函数与xslt字符串函数
以下是xslt数值的函数与xslt字符串函数的说明与参考示例. 1.xslt数值的函数:(1)fn:number(arg) 返回参数的数值.参数可以是布尔值.字符串或节点集. 示例:<xsl:v ...
- Unity 之旋转
代码如下: bool RotateDelta(Vector3 direction) { direction.y = ; if (direction == Vector3.zero) return tr ...
- Date转换为LocalDateTime
一.在Java 8中将Date转换为LocalDateTime 方法1: 将Date转换为LocalDatetime,我们可以使用以下方法: 1.从日期获取ZonedDateTime并使用其方法toL ...
- 可搭建SS服务上网的不限流量VPS推荐
https://itldc.com/en,7个机房,推荐指数:★★★★ 1995年运作至今,有多个机房,包括:新加坡.洛杉矶.新泽西.立陶宛.乌克兰.保加利亚.荷兰.VPS特征: KVM虚拟(支持BB ...
- 剑指offer——06二叉树的下一个节点
题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 题目的意思是,在一颗二叉树的中序遍历中,给出其中一 ...
- jwt、oauth2和oidc等认证授权技术的理解
前言 jwt.oauth2.oidc等,都是和认证授权相关的规范或者解决方案,因此要理解他们,就需要从业务场景的适用性一步步的分析和认识. 一.认证授权业务场景理解 就个人目前的理解来看,一个好的软件 ...
- Android读取logcat信息
测试的时候,经常遇到开发需要logcat分析定位bug,今天简单记录一下获取logcat的方法 前提条件:电脑中要安装好Android SDK 1.cmd 进入到这个界面 2.电脑连上手机,手机记得打 ...
- USACO 2008 January Silver Telephone Lines /// 二分最短路 邻接表dijkstra oj22924
题目大意: 一共有N (1 ≤ N ≤ 1,000)个电线杆,有P P (1 ≤ P ≤ 10,000)对电线杆是可以连接的, 用几条线连接在一起的电线杆之间都可相互通信,现在想要使得电线杆1和电线杆 ...
- SqlMapClient operation; bad SQL grammar []; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException: InlineParameterMap
<select id="getResByName" resultClass="Resources" parameterClass="java.l ...