博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ5292 & 洛谷4457 & LOJ2513:[BJOI2018]治疗之雨——题解
阅读量:6582 次
发布时间:2019-06-24

本文共 1833 字,大约阅读时间需要 6 分钟。

你现在有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
#include
#include
#include
#include
#include
#include
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
0){ if(q
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。               +

 +欢迎访问我的博客:+

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

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

你可能感兴趣的文章
性能测试 vbs使用(一)
查看>>
jQuery基础
查看>>
BZOJ5312:冒险——题解
查看>>
echarts,两点连线,中间断裂
查看>>
samba简易配置
查看>>
庆祝在CNBlogs开博!
查看>>
javascript reverse string
查看>>
南阳oj 题目6 喷水装置(一)
查看>>
运筹学上机实验 - 单纯形方法的两阶段法
查看>>
CF294C Shaass and Lights
查看>>
oracle 11g 报错记录
查看>>
文件状态是否变化
查看>>
MongoDB的副本集Replica Set
查看>>
Maven项目中的配置文件找不到以及打包问题
查看>>
面向对象
查看>>
HDU 1058 Humble Numbers
查看>>
NYOJ The Triangle
查看>>
wps10.1中将txt转为excel
查看>>
解决执行脚本报syntax error: unexpected end of file或syntax error near unexpected token `fi'错误的问题...
查看>>
[BZOJ3312][USACO]不找零(状压DP)
查看>>