题解 「BJOI2018 治疗之雨」
题目大意
有一个初始为 \(p\) 的数,每次操作分为以下两个:
有 \(\frac{1}{m+1}\) 的概率$+1,但是中途 \(p\) 的最大值只能为 \(n\)$
有 \(k\) 次减少操作,每次有 \(\frac{1}{m+1}\) 的概率 \(-1\)。
(每次先操作操作 \(1\) 然后操作操作 \(2\))
问 \(p\) 变为 \(0\) 的期望操作次数。
有 \(T\) 次询问,每次保证 \(1\le p\le n\le 1500,m,k\le 10^9\),答案对 \(10^9+7\) 取模。
思路
其实这道题很水,也不知道怎么评到黑题的。
首先,我们可以发现,\(k\) 次被打中 \(i\) 次的概率为 \(\frac{\binom{k}{i}m^{k-i}}{(m+1)^k}\) ,也就是说我们可以算出一次操作由 \(i\) 变为 \(j\) 的概率,我们假设这个为 \(p_{i,j}\)。
然后我们发现肯定可以设 \(f_i\) 表示当前值为 \(i\) 的剩余期望操作次数,我们可以得到转移式:
\]
\]
然后你发现这个东西可以用一个套路做了,就是说我们发现每一个 \(f_i\) 我们都可以表示为 \(a\times f_1+b\) 的形式,然后我们递推一下解个方程就可以求出 \(f_1\) 继而求出答案了。
时间复杂度 \(\Theta(Tn\log n)\)。
\(\texttt{Code}\)
#include <bits/stdc++.h>
using namespace std;
#define Int register int
#define mod 1000000007
#define MAXN 1505
template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T,typename ... Args> inline void read (T &t,Args&... args){read (t);read (args...);}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');}
int mul (int a,int b){return 1ll * a * b % mod;}
int dec (int a,int b){return a >= b ? a - b : a + mod - b;}
int add (int a,int b){return a + b >= mod ? a + b - mod : a + b;}
int qkpow (int a,int b){
int res = 1;for (;b;b >>= 1,a = mul (a,a)) if (b & 1) res = mul (res,a);
return res;
}
int inv (int x){return qkpow (x,mod - 2);}
int n,m,k,st,invx,invm,ci[MAXN],binom[MAXN];
int calc (int x){//计算k轮中减少x的概率
if (x < 0 || x > k) return 0;
else return mul (binom[x],mul (ci[x],invx));
}
int pro (int i,int j){
if (i == n) return calc (i - j);
else return add (mul (calc (i - j),dec (1,invm)),mul (calc (i - j + 1),invm));
}
struct node{
int k,b;//表示为k*f[1]+b
node (){}
node (int _k,int _b){k = _k,b = _b;}
node operator + (int x){return node (k,add (b,x));}
node operator - (int x){return node (k,dec (b,x));}
node operator * (int x){return node (mul (k,x),mul (b,x));}
node operator + (node x){return node (add (k,x.k),add (b,x.b));}
node operator - (node x){return node (dec (k,x.k),dec (b,x.b));}
}f[MAXN];
signed main(){
int T;read (T);
while (T --> 0){
read (n,st,m,k),invx = inv (qkpow (m + 1,k)),invm = inv (m + 1);
if (!k){puts ("-1");continue;}
if (!m){
if (k == 1) puts ("-1");
else{
int cnt = 0;
while (st > 0) cnt ++,st = min (n,st + 1) - k;
write (cnt),putchar ('\n');
}
continue;
}
binom[0] = 1;for (Int i = 1;i <= n;++ i) binom[i] = mul (binom[i - 1],mul (k - i + 1,inv (i)));
for (Int i = 0;i <= n && i <= k;++ i) ci[i] = qkpow (m,k - i);
f[1] = node (1,0);
for (Int i = 1;i <= n - 1;++ i){
f[i + 1] = node (0,0);
for (Int j = 1;j <= i;++ j) f[i + 1] = f[i + 1] + f[j] * pro (i,j);
f[i + 1] = (f[i] - 1 - f[i + 1]) * inv (pro (i,i + 1));
}
node sum = node (0,0);
for (Int i = 1;i <= n;++ i) sum = sum + f[i] * pro (n,i);
sum = f[n] - 1 - sum;int f1 = mul (mod - sum.b,inv (sum.k));
write (add (f[st].b,mul (f1,f[st].k))),putchar ('\n');
}
return 0;
}
题解 「BJOI2018 治疗之雨」的更多相关文章
- 【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 ...
- 洛谷P4457/loj#2513 [BJOI2018]治疗之雨(高斯消元+概率期望)
题面 传送门(loj) 传送门(洛谷) 题解 模拟赛的时候只想出了高斯消元然后死活不知道怎么继续--结果正解居然就是高斯消元卡常? 首先有个比较难受的地方是它一个回合可能不止扣一滴血--我们得算出\( ...
- [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 ...
- 题解 「BZOJ4919 Lydsy1706月赛」大根堆
题目传送门 题目大意 给出一个 \(n\) 个点的树,每个点有权值,从中选出一些点,使得满足大根堆的性质.(即一个点的祖先节点如果选了那么该点的祖先节点的权值一定需要大于该点权值) 问能选出来的大根堆 ...
- 「BJOI2018」链上二次求和
「BJOI2018」链上二次求和 https://loj.ac/problem/2512 我说今天上午写博客吧.怕自己写一上午,就决定先写道题. 然后我就调了一上午线段树. 花了2h找到lazy标记没 ...
随机推荐
- MySQL-Cluster 初识
最近,对mysql-cluster进行初步了解,发现和oracle提供的RAC有一定的相似之处,但区别又很大,下面主要是mysql-cluster的搭建,至于对其的深入了解,留着以后工作需 ...
- redux的使用
1.redux的使用 核心概念 action 动作的对象 包含2个属性 type:标识属性, 值为字符串, 唯一, 必要属性 data:数据属性, 值类型任意, 可选属性 例子:{ type: 'AD ...
- 程序解决十苹果问题 Java
程序解决十苹果问题 Java 题目:10个苹果,其中有9个重量相同,剩余1个相比其它重量不同(或重或轻,不得而知),使用天平比较三次,找出重量特殊的那一个 import org.junit.Test; ...
- Springboot自带定时任务实现动态配置Cron参数
同学们,我今天分享一下SpringBoot动态配置Cron参数.场景是这样子的:后台管理界面对定时任务进行管理,可动态修改执行时间,然后保存入库,每次任务执行前从库里查询时间,以达到动态修改Cron参 ...
- SpringBoot 属性配置文件数据注入配置和yml与properties区别
前言 我们知道SpringBoot 通过配置类来解放一堆的xml文件配置,通属性配置文件,来进行,系统全局属性配置,这样极大的简化了我们开发过程,java web 也可以甜甜的从此 快速配置 Spri ...
- 性能测试工具JMeter 基础(八)—— 测试元件: 逻辑控制器之事物控制器
事物控制器是将控制器下的所有取样器作为一个事物统计.分析 事物控制器(Transaction Controller) 事务控制器一共有两个选项: Generate parent sample:默认不勾 ...
- 泛微OA E-cology(CNVD-2019-32204)远程命令执行漏洞复现分析
漏洞复现 影响版本: E-cology 7.0 E-cology 8.0 E-cology 8.1 E-cology 9.0 直接在网站根目录后加入组件访问路径 /weaver/bsh.servl ...
- Nginx:进程调度
Blog:博客园 个人 Nginx采用的是固定数量的多进程模型,由一个主进程(MasterProcess)和数量与主机CPU核数相同的工作进程协同处理各种事件. 主管理进程负责工作进程的配置加载.启停 ...
- 深度学习——前向传播算法和反向传播算法(BP算法)及其推导
1 BP算法的推导 图1 一个简单的三层神经网络 图1所示是一个简单的三层(两个隐藏层,一个输出层)神经网络结构,假设我们使用这个神经网络来解决二分类问题,我们给这个网络一个输入样本,通过前向运算得到 ...
- VBox 虚拟机安装 Openwrt 做旁路由
VBox 虚拟机安装 Openwrt 做旁路由 需求:开个虚拟机做旁路由,电脑把网关设置成旁路由地址,用它跑个上网或其他什么东西. 安装及配置过程简述 这件事流程很简单,总结起来主要有以下几点: 安装 ...