【BZOJ5292】[BJOI2018]治疗之雨(高斯消元)

题面

BZOJ

洛谷

题解

设\(f[i]\)表示剩余\(i\)点生命时的期望死亡的次数。

考虑打\(k\)次下来脸上被打了\(i\)下的概率:\(\displaystyle \frac{{k\choose i}m^{k-i}}{(m+1)^k}\)。

\(m=0\)时全部打脸上了,直接判掉。

设\(P[i][j]\)表示\(i\)点血量奶完后再被打一轮下来变成\(j\)点血的概率,这个很容易算出来。

那么我们可以列出和\(f[i]\)相关的\(n+1\)个方程。

比如说:

\[\begin{cases}
f[0]=0\\
f[1]=P[1][0]*f[0]+P[1][1]*f[1]+P[1][2]*f[2]+1\\
...\\
f[n]=P[n][0]*f[0]+P[n][1]*f[1]+P[n][2]*f[2]+...+P[n][n]*f[n]+1
\end{cases}\]

考虑怎么解这个玩意,首先肯定可以高斯消元三方解决。

这个矩阵观察后发现类似于一个下三角矩阵,那么每次用第\(i\)行消掉\(i-1\)行,这样子就是一个下三角了,然后从上往下就可以直接求解。

还有一种方法就是移项后不难发现\(f[1]\)只和\(f[2]\)相关,因此可以设\(f[1]=x\),这样子其他所有数都可以通过\(x\)给表示出来,最后带到\(f[n]\)的方程里就可以解出\(x\)。

#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
#define MAX 1600
#define MOD 1000000007
void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int fpow(int a,int b){int s=1;while(b){if(b&1)s=1ll*s*a%MOD;a=1ll*a*a%MOD;b>>=1;}return s;}
int n,p,m,k;
int P[MAX],a[MAX][MAX];
int A[MAX],B[MAX];
int main()
{
int T=read();
while(T--)
{
n=read();p=read();m=read();k=read();
if(!k){puts("-1");continue;}
if(m==0)
{
int cnt=0;if(k==1){puts("-1");continue;}
while(p>0)++cnt,p=min(n,p+1)-k;
printf("%d\n",cnt);continue;
}
for(int i=0;i<=n;++i)P[i]=0;
int invm1=fpow(m+1,MOD-2);P[0]=1;
for(int i=1;i<n&&i<=k;++i)P[i]=1ll*P[i-1]*fpow(i,MOD-2)%MOD*(k-i+1)%MOD;
for(int i=0;i<n&&i<=k;++i)P[i]=1ll*P[i]*fpow(m,k-i)%MOD*fpow(fpow(m+1,k),MOD-2)%MOD;
if(k>=n){P[n]=1;for(int i=0;i<n;++i)P[n]=(P[n]+MOD-P[i])%MOD;}
for(int i=0;i<=n;++i)
for(int j=0;j<=n;++j)a[i][j]=0;
for(int i=1;i<n;++i)
for(int j=1;j<=i+1;++j)
add(a[i][j],(1ll*invm1*P[i-j+1]+1ll*m*invm1%MOD*P[i-j])%MOD);
for(int i=1;i<=n;++i)add(a[n][i],P[n-i]);
for(int i=0;i<=n;++i)A[i]=B[i]=0;
A[1]=1;B[1]=0;
for(int i=1;i<n;++i)
{
int sa=A[i],sb=(MOD-1+B[i])%MOD;
for(int j=1;j<=i;++j)sa=(sa+MOD-1ll*a[i][j]*A[j]%MOD)%MOD;
for(int j=1;j<=i;++j)sb=(sb+MOD-1ll*a[i][j]*B[j]%MOD)%MOD;
int v=fpow(a[i][i+1],MOD-2);
A[i+1]=1ll*sa*v%MOD;B[i+1]=1ll*sb*v%MOD;
}
int sa=A[n],sb=(MOD-B[n]+1)%MOD;
for(int i=1;i<=n;++i)sa=(sa+MOD-1ll*a[n][i]*A[i]%MOD)%MOD;
for(int i=1;i<=n;++i)sb=(sb+1ll*a[n][i]*B[i])%MOD;
int x=1ll*sb*fpow(sa,MOD-2)%MOD;
int ans=(1ll*A[p]*x+B[p])%MOD;
printf("%d\n",ans);
continue;
}
}

【BZOJ5292】[BJOI2018]治疗之雨(高斯消元)的更多相关文章

  1. [BZOJ5292][BJOI2018]治疗之雨(概率DP+高斯消元)

    https://blog.csdn.net/xyz32768/article/details/83217209 不难找到DP方程与辅助DP方程,发现DP方程具有后效性,于是高斯消元即可. 但朴素消元显 ...

  2. [BZOJ5292] [BJOI2018]治疗之雨

    题目链接 BZOJ:https://lydsy.com/JudgeOnline/problem.php?id=5292 洛谷:https://www.luogu.org/problemnew/show ...

  3. luoguP4457 [BJOI2018]治疗之雨 概率期望 + 高斯消元

    应该是最后一道紫色的概率了....然而颜色啥也代表不了.... 首先看懂题意: 你现在有$p$点体力,你的体力上限为$n$ 在一轮中, 1.如果你的体力没有满,你有$\frac{1}{m + 1}$的 ...

  4. 洛谷P4457/loj#2513 [BJOI2018]治疗之雨(高斯消元+概率期望)

    题面 传送门(loj) 传送门(洛谷) 题解 模拟赛的时候只想出了高斯消元然后死活不知道怎么继续--结果正解居然就是高斯消元卡常? 首先有个比较难受的地方是它一个回合可能不止扣一滴血--我们得算出\( ...

  5. P4457-[BJOI2018]治疗之雨【期望dp,高斯消元】

    正题 题目链接:https://www.luogu.com.cn/problem/P4457 题目大意 开始一个人最大生命值为\(n\),剩余\(hp\)点生命,然后每个时刻如果生命值没有满那么有\( ...

  6. BZOJ5292 & 洛谷4457 & LOJ2513:[BJOI2018]治疗之雨——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5292 https://www.luogu.org/problemnew/show/P4457 ht ...

  7. 【BZOJ-3143】游走 高斯消元 + 概率期望

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2264  Solved: 987[Submit][Status] ...

  8. 【BZOJ-3270】博物馆 高斯消元 + 概率期望

    3270: 博物馆 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 292  Solved: 158[Submit][Status][Discuss] ...

  9. *POJ 1222 高斯消元

    EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9612   Accepted: 62 ...

随机推荐

  1. PS调出清新淡雅外景女生背影照

    首先,依然是前期事项. 这套图是八月份下午三点多在草地上拍的(好像标题的秋日欺骗了大众XD),阳光很烈,不过也因为这样,能拍出比较清新的蓝天.用的是腾龙70-200 2.8VC拍摄,长焦在拍这种空旷大 ...

  2. 基于CRM跟进(活动)记录中关键字识别的客户跟进加权值的成单概率算法

    1.提取销售人员的跟进记录,分析其中的骂人文字(负面情绪),将有负面情绪的客户的跟进排期,进行降权(权重)操作.重点跟进加权值较高的客户. 执行办法: 将销售与客户沟通的语音:电话,微信,QQ,通过调 ...

  3. MySQL 日期类型函数及使用

    1 MySQL 数据库中有五种与日期时间有关的数据类型,各种日期数据类型所占空间如下图所示: 2 datetime 与 date datetime 占用8字节,是占用空间最多的一种日期格式.它显示日期 ...

  4. Oracle 序列(sequence)

    序列(sequence) 是Oracle提供的用于生成一系列唯一数字的数据库对象.它会自动生成顺序递增或者递减的序列号,以实现自动提供唯一的主键值.序列可以在多用户并发环境中使用,并且可以为所有用户生 ...

  5. Spark源码编译,官网学习

    这里以spark-1.6.0版本为例 官网网址   http://spark.apache.org/docs/1.6.0/building-spark.html#building-with-build ...

  6. 关于 html input标签的几个常用操作

    1.清除 input 标签默认样式 input { -moz-appearance: none; outline: 0; text-decoration: none; outline: none; b ...

  7. linux audit (9)--生成audit报表

    aureport这个命令可以生成一个总结性的柱状图报表,默认情况下,在/var/log/audit目录下的所有日志文件都会生成一个报表,也可以使用如下命令来指定一个不同的文件,aureport opt ...

  8. 记一次tomcat7.0版本启动项目失败问题

    测试项目在tomcat7中启动失败,报错如下: @794314bc3 Error during job execution (jobs.Bootstrap) Oops: VerifyError ~ p ...

  9. Python:matplotlib绘制线条图

    线型图是学习matplotlib绘图的最基础案例.我们来看看具体过程:  下面我们将两条曲线绘制到一个图形里:   可以看到这种方式下,两个线条共用一个坐标轴,并且自动区分颜色. plot方法的核心是 ...

  10. SWT 几个sample网站

    https://www.programcreek.com/java-api-examples/org.eclipse.swt.custom.ScrolledComposite https://o7pl ...