题解

具体就是列一个未知数方程\(dp[i]\)表示有\(i\)滴血的时候期望多少轮

\(dp[i] = 1 + \sum_{j = 1}^{i + 1} a_{i,j}dp[j]\)

\(dp[n] = 1 + \sum_{j = 1}^{n} a_{i,j}dp[j]\)

\(a_{i,j}\)表示从\(i\)滴血到\(j\)滴血的概率

可以高斯消元?

但是发现这个似乎和递推形式只差一点点

\(a_{i,i + 1} dp[i + 1] = -1 - \sum_{j = 1}^{i - 1} a_{i,j}dp[j] + (1 - a_{i,i})dp[i]\)

但是我们不知道\(dp[1]\)

我们可以把\(dp[1]\)设成\(X\),然后用前\(n - 1\)个式子推出来\(dp[n] = A_1x + B_1\)

用第\(n\)个式子再推出来\(dp[n] = A_2x + B_2\)就可以解出来\(x\)了

代码

  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pii pair<int,int>
  5. #define mp make_pair
  6. #define pb push_back
  7. #define enter putchar('\n')
  8. #define space putchar(' ')
  9. #define MAXN 20005
  10. #define eps 1e-8
  11. //#define ivorysi
  12. using namespace std;
  13. typedef long long int64;
  14. typedef double db;
  15. template<class T>
  16. void read(T &res) {
  17. res = 0;char c = getchar();T f = 1;
  18. while(c < '0' || c > '9') {
  19. if(c == '-') f = -1;
  20. c = getchar();
  21. }
  22. while(c >= '0' && c <= '9') {
  23. res = res * 10 + c - '0';
  24. c = getchar();
  25. }
  26. res *= f;
  27. }
  28. template<class T>
  29. void out(T x) {
  30. if(x < 0) {x = -x;putchar('-');}
  31. if(x >= 10) {
  32. out(x / 10);
  33. }
  34. putchar('0' + x % 10);
  35. }
  36. const int MOD = 1000000007;
  37. int C[1505],N,M,P,K;
  38. pii dp[1505];
  39. int g[1505],f[1505],d[1505],inv[1505],ad[1505];
  40. int inc(int a,int b) {
  41. return a + b >= MOD ? a + b - MOD : a + b;
  42. }
  43. int mul(int a,int b) {
  44. return 1LL * a * b % MOD;
  45. }
  46. int fpow(int x,int c) {
  47. int res = 1,t = x;
  48. while(c) {
  49. if(c & 1) res = mul(res,t);
  50. t = mul(t,t);
  51. c >>= 1;
  52. }
  53. return res;
  54. }
  55. const pii operator + (const pii &a,const pii &b) {
  56. return mp(inc(a.fi,b.fi),inc(a.se,b.se));
  57. }
  58. const pii operator * (const pii &a,const int &d) {
  59. return mp(mul(a.fi,d),mul(a.se,d));
  60. }
  61. void update(pii &a,pii b) {
  62. a = a + b;
  63. }
  64. void Solve() {
  65. read(N);read(P);read(M);read(K);
  66. if(K == 0) {puts("-1");return;}
  67. if(M == 0) {
  68. if(K == 1) {
  69. puts("-1");
  70. }
  71. else {
  72. int cnt = 0;
  73. if(P == N) {P = max(0,P - K);++cnt;}
  74. if(P) cnt += (P - 1) / (K - 1) + 1;
  75. out(cnt);enter;
  76. }
  77. return;
  78. }
  79. int T = min(N,K);
  80. int InvM = fpow(M,MOD - 2),InvM1 = fpow(M + 1,MOD - 2);
  81. C[0] = 1;C[1] = K;
  82. g[0] = 1;f[0] = fpow(mul(InvM1,M),K);int t = mul(InvM,M + 1);
  83. g[1] = InvM1,f[1] = mul(f[0],t);
  84. for(int i = 2 ; i <= T ; ++i) {
  85. C[i] = mul(C[i - 1],mul(inv[i],inc(K,MOD - i + 1)));
  86. g[i] = mul(g[i - 1],g[1]);
  87. f[i] = mul(f[i - 1],t);
  88. }
  89. for(int i = 0 ; i <= T ; ++i) {
  90. t = mul(C[i],mul(g[i],f[i]));
  91. d[i] = mul(t,mul(M,InvM1));
  92. ad[i] = mul(t,InvM1);
  93. }
  94. for(int i = T + 1 ; i <= N ; ++i) d[i] = ad[i] = 0;
  95. dp[1] = mp(1,0);
  96. for(int i = 2 ; i <= N ; ++i) {
  97. dp[i] = mp(0,MOD - 1);
  98. update(dp[i],dp[i - 1] * inc(1,MOD - inc(d[0],ad[1])));
  99. for(int j = 1 ; j < i - 1; ++j) {
  100. update(dp[i],dp[j] * (MOD - inc(d[i - 1 - j],ad[i - j])));
  101. }
  102. dp[i] = dp[i] * fpow(ad[0],MOD - 2);
  103. }
  104. pii another = mp(0,1);
  105. for(int i = 1 ; i < N ; ++i) {
  106. if(N - i <= T) {
  107. t = mul(C[N - i],mul(g[N - i],f[N - i]));
  108. update(another,dp[i] * t);
  109. }
  110. }
  111. another = another * fpow(inc(1,MOD - f[0]),MOD - 2);
  112. if(another.fi == dp[N].fi) {puts("-1");return;}
  113. int x = mul(inc(dp[N].se,MOD - another.se),fpow(inc(another.fi,MOD - dp[N].fi),MOD - 2));
  114. out(inc(mul(dp[P].fi,x),dp[P].se));enter;
  115. }
  116. int main() {
  117. #ifdef ivorysi
  118. freopen("f1.in","r",stdin);
  119. #endif
  120. inv[1] = 1;
  121. for(int i = 2 ; i <= 1500 ; ++i) {
  122. inv[i] = mul(inv[MOD % i],MOD - MOD / i);
  123. }
  124. int T;read(T);
  125. while(T--) Solve();
  126. return 0;
  127. }

【LOJ】#2513. 「BJOI2018」治疗之雨的更多相关文章

  1. 「BJOI2018」治疗之雨

    传送门 Description 有\(m+1\)个数,第一个数为\(p\),每轮:选一个数\(+1\),再依次选\(k\)个数\(-1\) 要求如果第一个数\(=N\),不能选它\(+1\),如果第一 ...

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

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

  3. LOJ #6436. 「PKUSC2018」神仙的游戏(字符串+NTT)

    题面 LOJ #6436. 「PKUSC2018」神仙的游戏 题解 参考 yyb 的口中的长郡最强选手 租酥雨大佬的博客 ... 一开始以为 通配符匹配 就是类似于 BZOJ 4259: 残缺的字符串 ...

  4. 「BJOI2018」链上二次求和

    「BJOI2018」链上二次求和 https://loj.ac/problem/2512 我说今天上午写博客吧.怕自己写一上午,就决定先写道题. 然后我就调了一上午线段树. 花了2h找到lazy标记没 ...

  5. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  6. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  7. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

  8. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

  9. Loj #2542. 「PKUWC2018」随机游走

    Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...

随机推荐

  1. 【题解】 bzoj1875: [SDOI2009]HH去散步 (动态规划+矩阵乘法)

    bzoj1875,懒得复制,戳我戳我 Solution: 看到这道题,看的出是个dp,每个点\(t\)时刻到达的方案数等于\(t-1\)到连过来的点方案数之和 但又因为题目有要求不能走一样的边回去不是 ...

  2. 【agc002f】Leftmost Ball(动态规划)

    [agc002f]Leftmost Ball(动态规划) 题面 atcoder 洛谷 题解 我们从前往后依次把每个颜色按顺序来放,那么如果当前放的是某种颜色的第一个球,那么放的就会变成\(0\)号颜色 ...

  3. CF494C Helping People 解题报告

    CF494C Helping People 题意翻译 有一个长为 \(n\) 的数列,初始时为 \(a_{1\dots n}\). 给你 \(q\) 个操作,第 \(i\) 个操作将 \([l_i,r ...

  4. 【uoj228】 基础数据结构练习题

    http://uoj.ac/problem/228 (题目链接) 题意 给出一个序列,维护区间加法,区间开根,区间求和 Solution 线段树.考虑区间开根怎么做.当区间的最大值与最小值相等时,我们 ...

  5. 基础知识--:before伪元素和:after伪元素

    http://book.51cto.com/art/201108/285688.htm 3.7  替换指定位置 大家都知道before和after是前.后的意思.但是奇怪的是,CSS中的:before ...

  6. ELK应用之一:ELK平台搭建部署

    一.获取安装包: EKL官网:https://www.elastic.co/products 二.安装Elasticsearch 2.1.解压安装包,在安装目录创建data和logs目录,并在配置文件 ...

  7. duilib踩坑记录

    duilib官方 https://github.com/duilib/duilib duilib他人扩展 https://github.com/qdtroy/DuiLib_Ultimate 关于两者的 ...

  8. MySQL存储引擎对比

    MySQL存储引擎对比 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL的存储引擎 大家应该知道MySQL的存储引擎应该是表级别的概念,因为我们无法再创建databas ...

  9. RabbitMQ入门介绍

    1.关于AMQP协议 AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设 ...

  10. bzoj千题计划268:bzoj3131: [Sdoi2013]淘金

    http://www.lydsy.com/JudgeOnline/problem.php?id=3131 如果已知 s[i]=j 表示有j个<=n数的数码乘积=i 那么就会有 s[a1]*s[a ...