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

https://www.lydsy.com/JudgeOnline/problem.php?id=5292

https://www.luogu.org/problemnew/show/P4457

https://loj.ac/problem/2513

你现在有m+1个数:第一个为p,最小值为0,最大值为n;剩下m个都是无穷,没有最小值或最大值。
你可以进行任意多轮操作,每轮操作如下:
在不为最大值的数中等概率随机选择一个(如果没有则不操作),把它加一;
进行k次这个步骤:在不为最小值的数中等概率随机选择一个(如果没有则不操作),把它减一。
现在问期望进行多少轮操作以后第一个数会变为最小值0。

期望dp的一个惯用套路。

设f[i]为正好打中英雄i下的概率,则f[i]=C(k,i)*(1/(m+1))^k*(m/(m+1))^(k-i)

于是不难得到f[i]与f[i-1]之间的关系,则线性推之。

再设a[i][j]为英雄i血经过一轮变j血的概率。

则a[i][j]=(f[i-j]*m+f[i+1-j])/(m+1),但是当i=n时不适用,当i<j时也不适用,二者特判之。

最后令x[i]为英雄到i血的期望。

则有:

x[0]=0;

x[1]=a[1][2]*x[2]+a[1][1]*x[1]+1

x[2]=a[2][3]*x[3]+a[2][2]*x[2]+a[2][1]*x[1]+1

……

x[n]=a[n][n]*x[n]+a[n][n-1]*x[n-1]+……

(注意最后一项有细微差别。)

此时我们可以高斯消元求出答案……?

n=1500仿佛在开玩笑。

那么这样的式子一定有什么特殊的方法可以消元。

我们每次用1式消掉x[1],用2式x[2]……,则复杂度其实只需要O(n^2)(因为1式只有2个数,2式消完后也只有2个数……以此类推)

这样我们每一个式子就是一个二元一次方程,最后一个式子是一个一元一次方程,于是就可以求解了。

(PS:还有其他比如k=0/1,m=0之类的特判不要忘了加。)

#include<cmath>
#include<queue>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1505;
const int p=1e9+7;
inline ll read(){ll X=0,w=0;char ch=0;while(!isdigit(ch)){w|=ch=='-';ch=getchar();}while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
ll qpow(ll k,int n){ll res=1;while(n){if(n&1)res=res*k%p;k=k*k%p;n>>=1;}return res;
}
ll n,q,m,k,f[N],a[N][N],x[N];
inline void init(){ll inv1=qpow(m+1,p-2),inv2=qpow(m,p-2);f[0]=qpow(inv1*m%p,k);for(int i=1;i<=min(n,k);i++)f[i]=f[i-1]*inv2%p*qpow(i,p-2)%p*(k-i+1)%p;for(int i=1;i<n;i++){for(int j=1;j<=i;j++)a[i][j]=(f[i-j]*m%p+f[i+1-j])%p*inv1%p;a[i][i+1]=f[0]*inv1%p;}for(int j=1;j<=n;j++)a[n][j]=f[n-j];for(int i=1;i<=n;i++)a[i][n+1]=p-1;for(int i=1;i<=n;i++)(a[i][i]+=p-1)%=p;
}
ll solve(){if(!k)return -1;if(!m){if(k==1)return -1;int res=0;while(q>0){if(q<n)q++;q-=k;res++;}return res;}init();for(int i=1;i<=n;i++){ll inv=qpow(a[i][i],p-2);a[i][i]=1;(a[i][n+1]*=inv)%=p;if(i!=n)(a[i][i+1]*=inv)%=p;for(int j=i+1;j<=n;j++){ll tmp=a[j][i];a[j][i]=0;(a[j][i+1]+=p-tmp*a[i][i+1]%p)%=p;(a[j][n+1]+=p-tmp*a[i][n+1]%p)%=p;}}x[n]=a[n][n+1];for(int i=n;i>q;i--)x[i-1]=(a[i-1][n+1]-a[i-1][i]*x[i]%p+p)%p;memset(f,0,sizeof(f));return x[q];
}
int main(){int t=read();while(t--){n=read(),q=read(),m=read(),k=read();printf("%lld\n",solve());}return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

 +本文作者:luyouqi233。               +

 +欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/9116458.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/390342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP--------微信网页开发实现微信扫码功能

今天说说微商城项目中用到的扫一扫这个功能&#xff0c;分享一下&#xff0c;希望对各位有所帮助。 前提&#xff1a;要有公众号&#xff0c;和通过微信认证&#xff0c;绑定域名&#xff0c;得到相应信息&#xff0c;appid&#xff0c;appsecret等。 微信开发文档&#xff1a;…

313. 超级丑数

超级丑数 是一个正整数&#xff0c;并满足其所有质因数都出现在质数数组 primes 中。 给你一个整数 n 和一个整数数组 primes &#xff0c;返回第 n 个 超级丑数 。 题目数据保证第 n 个 超级丑数 在 32-bit 带符号整数范围内。 示例 1&#xff1a; 输入&#xff1a;n 12,…

初创公司股本结构_我如何向初创公司的开发团队添加一些结构-以及从过程中学到的东西

初创公司股本结构Until recently, Id spent the last 4 years of my career at FinTech start-ups. Id always worked for smaller companies, and being at a start-up was the next logical step in looking for roles where I could make the biggest difference. 直到最近…

拿什么拯救你,我的面试之——从零打卡刷Leetcode(No.003)

写在前边&#xff1a;小詹一直觉得自己编程能力不强&#xff0c;想在网上刷题&#xff0c;又怕不能坚持。不知道有木有和小伙伴和小詹一样想找个人一起刷题呢&#xff1f;欢迎和小詹一起定期刷leetcode&#xff0c;每周一周五更新一题&#xff0c;每一题都吃透&#xff0c;欢迎…

146. LRU 缓存机制

146. LRU 缓存机制 运用你所掌握的数据结构&#xff0c;设计和实现一个 LRU (最近最少使用) 缓存机制 。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回…

[SQL] 请教一下 count里面有case when 一般情况下啥时候用

http://www.itpub.net/forum.php?modviewthread&tid1810967 问题: 比如 count(case when pday_id${deal_date} then 1 end) 我有点想不明白具体什么情况下count&#xff08;&#xff09; 这个小括号里面还要用case when 大家做BI统计的时候一般什么情况用啊 还有个…

路由器架设虚拟服务器让外网访问到本地网站

确定电脑与路由器正确连接&#xff0c;并且已连至互联网。在地址栏中输入192.168.0.1回车&#xff0c;输入用户名密码&#xff0c;进入路由器主界面。 然后点击左侧菜单中的“虚拟服务器”&#xff0c;——“端口段映射”打开“端口段映射”界面。 由于网站用的是80端口&#x…

vue项目示例代码git_您应该了解的5个Git命令以及代码示例

vue项目示例代码gitIve used Git for some years now, and I still find myself googling how to do some basic tasks. So this article is my attempt to learn how to do some of these things by writing about them. And even if I still forget, at least Ill have a ref…

413. 等差数列划分

413. 等差数列划分 如果一个数列 至少有三个元素 &#xff0c;并且任意两个相邻元素之差相同&#xff0c;则称该数列为等差数列。 例如&#xff0c;[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。 给你一个整数数组 nums &#xff0c;返回数组 nums 中所有为等差数组…

山羊与汽车游戏的实验算法

实验1&#xff1a; function shuffle(target) {var j, x, i target.length;for (; i > 0; j parseInt(Math.random() * i), x target[--i], target[i] target[j], target[j] x) {}return target }function removeAt(target, index) {return !!target.splice(index, 1).…

selenium模块

selenium模块 阅读目录 一 介绍二 安装三 基本使用四 选择器五 等待元素被加载六 元素交互操作七 其他八 项目练习一 介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题selenium本质是通过驱动浏览器&#xff0c;完…

关闭iphone来电mac_如何在Mac和iPhone上关闭通用剪贴板切换(以及为什么要禁用此功能)

关闭iphone来电macIm about to tell you something that will shock you, and probably make you very angry. I hope you wont hate me for it. Here goes.我正要告诉您一些令您震惊的事情&#xff0c;并可能使您非常生气。 我希望你不会为此而恨我。 开始。 If you are an i…

关于tomcat Post 数据参数的问题

2019独角兽企业重金招聘Python工程师标准>>> POST请求本身并未限制传入参数大小&#xff0c;是tomcat 容器设置了接收参数大小的限制。修改server.xml <Connector port"8080" protocol"HTTP/1.1" connectionTimeout"2000" red…

iOS:通信录(完成)(18-01-18更)

1、读取通信录 1&#xff09;、9.0以前&#xff1a;AddressBook 2&#xff09;、9.0以后&#xff1a;Contacts 2、调用通信录UI&#xff08;不弄&#xff09; 1&#xff09;、9.0以前&#xff1a;AddressBookUI 2&#xff09;、9.0以后&#xff1a;ContactsUI 3、参考 0、写在前…

如何在React Native和Firebase中设置Google登录

Google sign-in is a great login feature to offer to your apps users. It makes it easier for them to create an account and sign in. Google登录是一项出色的登录功能&#xff0c;可为您的应用程序用户提供。 这使他们更容易创建帐户并登录。 And whats even better, F…

设计模式-发布订阅模式

这段时间在看vue的双向绑定原理&#xff0c;知道了vue的核心三大件&#xff1a;Observer, Complie, Watcher。 Observer用于监听属性的变化&#xff0c;如有变动就通知 Watcher。 Compile负责解析元素节点的指令&#xff0c;如v-if&#xff0c;v-bind之类, 进行数据和回调函数的…

杜教筛--51nod1239 欧拉函数之和

求$\sum_{i1}^{n}\varphi (i)$&#xff0c;$n\leqslant 1e10$。 这里先把杜教筛的一般套路贴一下&#xff1a; 要求$S(n)\sum_{i1}^{n}f(i)$&#xff0c;而现在有一数论函数$g(i)$&#xff0c;$g(i)$的前缀和很无脑&#xff0c;且$f$和$g$的狄利克雷卷积的前缀和很无脑&#xf…

【Android Studio安装部署系列】目录

概述 从刚开始使用Android Studio到现在&#xff0c;下面所有目录下的操作&#xff0c;当时习惯性的把每一个整理成一个文档&#xff08;其实就是简单文字描述截图&#xff09;&#xff1b;有些地方当时是一知半解&#xff0c;现在会稍微明白一些。正好赶上现在有时间。所以就想…

修改npm全局安装模式的路径

修改npm全局安装模式的路径 在正式写此文章之前&#xff0c;我得说一点血泪史。 刚学nodeJS不久&#xff0c;很纳闷为什么全局安装的模块在 node安装目录/node_modules‘ 中没找到&#xff01;后来仔细看了下安装成功后的信息&#xff0c;才发现原来是自动安装在C盘了&#xff…

javascript创建类_如何使用JavaScript创建吹气效果

javascript创建类Have you ever wondered how you can create a realistic air blowing effect with JavaScript? Like the one shown on the evening TV shows, where multiple balls are being mixed up in a sphere-like object by leveraging air pressure? If you want …