题意:你的英雄一开始血量为p,你还有m个队友,血量无穷。血量上限为n,下限为0。如果血量满了就不能加血。每次启动操作,随机给m+1个英雄加1点血,然后等概率随机k次每次对于英雄扣1点血。求期望操作几次你的英雄没血?

n,m,p<=1500.

标程:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int mod=1e9+;
  5. const int N=;
  6. int n,p,m,k,f[N],inv[N],g[N][N],ans[N];
  7. int ksm(int x,int y)
  8. {
  9. int res=;
  10. while (y) {if (y&) res=(ll)res*x%mod; y>>=;x=(ll)x*x%mod;}
  11. return res;
  12. }
  13. int Inv(int x){return ksm(x,mod-);}
  14. void gauss()
  15. {
  16. for (int i=n;i>=;i--)
  17. {
  18. if (g[i][i]==&&g[i-][i]==) {puts("-1");return;}
  19. if (g[i][i]==)
  20. {
  21. for (int j=;j<=i;j++) swap(g[i][j],g[i-][j]);
  22. swap(g[i][n+],g[i-][n+]);
  23. }
  24. else
  25. {
  26. if (!g[i-][i]) continue;
  27. int v=(ll)g[i-][i]*Inv(g[i][i])%mod;
  28. for (int j=;j<=i;j++)
  29. g[i-][j]=((ll)g[i-][j]-(ll)g[i][j]*v%mod+mod)%mod;
  30. g[i-][n+]=((ll)g[i-][n+]-(ll)g[i][n+]*v%mod+mod)%mod;
  31. }
  32. }
  33. for (int i=;i<=p;i++)
  34. {
  35. ans[i]=g[i][n+];
  36. for (int j=;j<i;j++)
  37. ans[i]=((ll)ans[i]-(ll)ans[j]*g[i][j]%mod+mod)%mod;
  38. ans[i]=(ll)ans[i]*Inv(g[i][i])%mod;
  39. if (!ans[i]) {puts("-1");return;}
  40. }
  41. printf("%d\n",ans[p]);
  42. }
  43. void init()
  44. {
  45. memset(g,,sizeof(g));
  46. int tmp=,c=,in,inn;in=inn=Inv(m+);
  47. for (int i=;i<=min(n,k);i++)
  48. {
  49. c=(ll)c*(k-i+)%mod*inv[i]%mod;
  50. tmp=(ll)tmp*in%mod;
  51. f[i]=(ll)c*tmp%mod;
  52. }
  53. in=(ll)m*in%mod;tmp=ksm(in,k-min(n,k));
  54. f[]=;
  55. for (int i=min(n,k);i>=;i--)
  56. f[i]=(ll)f[i]*tmp%mod,tmp=(ll)tmp*in%mod;
  57.  
  58. for (int i=;i<=n;i++)
  59. {
  60. if (i==n) in=,inn=;
  61. for (int j=max(i-k,);j<=i;j++)
  62. {
  63. g[i][j]=((ll)g[i][j]+(ll)f[i-j]*in%mod)%mod;
  64. if (j+<=n) g[i][j+]=(ll)f[i-j]*inn%mod;
  65. }
  66. g[i][i]=((ll)g[i][i]-+mod)%mod;g[i][n+]=mod-;
  67. }
  68. }
  69. int main()
  70. {
  71. int T;scanf("%d",&T);
  72. inv[]=inv[]=; for (int i=;i<=;i++) inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
  73. while (T--) {
  74. scanf("%d%d%d%d",&n,&p,&m,&k);
  75. init();gauss();
  76. }
  77. return ;
  78. }

易错点: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 治疗之雨的更多相关文章

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

    [BZOJ5292][BJOI2018]治疗之雨(高斯消元) 题面 BZOJ 洛谷 题解 设\(f[i]\)表示剩余\(i\)点生命时的期望死亡的次数. 考虑打\(k\)次下来脸上被打了\(i\)下的 ...

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

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

  3. 【LOJ2513】「BJOI2018」治疗之雨

    题意 你现在有 \(m+1\) 个数:第一个为 \(p\) ,最小值为 \(0\) ,最大值为 \(n\) :剩下 \(m\) 个都是无穷,没有最小值或最大值.你可以进行任意多轮操作,每轮操作如下: ...

  4. 【LOJ】#2513. 「BJOI2018」治疗之雨

    题解 具体就是列一个未知数方程\(dp[i]\)表示有\(i\)滴血的时候期望多少轮 \(dp[i] = 1 + \sum_{j = 1}^{i + 1} a_{i,j}dp[j]\) \(dp[n] ...

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

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

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

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

  7. [BJOI2018]治疗之雨

    题目 我还没疯 发现如果我们将血量抽象成点,一轮操作抽象成图上的一条边,我们如果能求出每一条边的概率,我们就能搞一下这道题 假设我们求出了这个图\(E\),设\(dp_i\)表示从\(i\)点到达\( ...

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

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

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

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

随机推荐

  1. GoF著作中未提到的设计模式(2):Interceptor

    转:http://www.cnblogs.com/west-link/archive/2011/06/22/2086591.html 拦截器模式为我们提供了一种拦截方法调用或消息的途径,整个过程是自动 ...

  2. Python3 From Zero——{最初的意识:001~数据结构和算法}

    一.从队列两端高效插入.删除元素,及保留固定数量的数据条目: collections.deque([iterable[,maxlen=N]]) a = collections.deque([1, 2] ...

  3. Linux下core文件调试

    1,ulimit -a查看默认参数 2,ulimit -c 1024 设置core文件大小,如果超过1024个blocks,则不会产生core文件 注:tune2fs -l /dev/sda8 输出分 ...

  4. 21-Ubuntu-文件和目录命令-复制文件和目录-cp

    cp 将给出的文件或目录复制到另一个文件或目录,相当于DOS下的copy命令 选项 含义 -f 已经存在的目标文件直接覆盖,不提示 -i 覆盖文件前提示 -r 若给出的源文件是目录文件,则cp将递归复 ...

  5. uoj140 【UER #4】被粉碎的数字

    题目 看起来就像是数位\(\rm dp\) 不妨从竖式乘法的角度来考虑这个问题 为了方便处理进位,我们得从低位向高位填数 设\(dp[i][0/1][j][p][t]\)表示填到了第\(i\)位,卡不 ...

  6. Java笔记之public、protected、default和private

    参考链接:private public protected default区别 - Ma_xiao_shuai的博客 - CSDN博客

  7. 【POJ】1321棋盘问题

    题目链接:http://poj.org/problem?id=1321 题意:见题干,很清楚了. 题解:简单dfs,参照八皇后 代码: #include<iostream> #includ ...

  8. 织梦自增函数[field:global name=autoindex/]常见用法

    看来不少朋友需要不了解这个自增函数的用法,在这里我列举一些常见的写法以及作用.   [field:global name=autoindex/] !--普通打印递增的数字-- [field:globa ...

  9. VBA提取HTML文件信息

    Sub test()    Dim html As Object, D As Object, W As Object, arr()    Set html = CreateObject("m ...

  10. PokerNet-poker recognition: 扑克识别 (6)

    文章目录 准备 最终结果 未来改进 准备 机器: Titan XP 12GB, 64GB RAM, 机器非常强,可靠. 下次有机会购买RTX 2080 Ti 试试 最终结果 错误率可以达到万分之一,非 ...