题意:有一个1001 * n的矩形,每个位置有q的概率为1。求紧贴下边界的最大的全1子矩形面积恰为k的概率。n <= 1e9,k <= 1000。

解:只需考虑每一列最下面一个0的位置。

首先有个n = 1的部分分,答案显然就是qk(1-q)。

中间还有些部分分,什么打表啊笛卡尔树上DP啊...感觉有毒。

接下来就是一个nk的DP,直接获得70分...感觉有毒。

首先发现这个恰好为k不好处理,就考虑计算<= k和<= k - 1,然后相减。注意因为面积全是整数而我们不是求期望,所以不会有非整数的出现。

考虑到下边界一定被若干个0分隔开,且每两个相邻0之间距离不大于k。于是我们按照0来DP。设fi表示1001 * i的矩形符合条件的概率。那么每次枚举这一段下边界的最后一个0在j位置,那么概率就是fj-1 * (1 - q) * (长为i-j的一段最下面全是1,符合条件的概率)。

考虑怎么求最后那个东西。

发现把最下面一行去掉之后好像有点像一个子问题?然而好像不行...实际上是一种类似最值分治的做法。

考虑这些列中最低的一列在哪(枚举得到),然后左右两边就是一个真实子问题,而中间这一列就是n = 1的部分分。但是还是不知道最低一列到底有多低...发现k只有1000,所以就可以枚举?

然而正解是多加一维状态表示高度。设gi,j表示1001 * i的矩形,最下面j * i的矩形全是1,且满足条件的概率。设j + 1行第一个0在p位置,那么gi,j += gp-1,j+1 * gi-p,j * qj * (1-q)。

边界条件就是g0,x = 1。

这东西难调死了......注意fn其实等于gn,0

  1. /**
  2. * There is no end though there is a start in space. ---Infinity.
  3. * It has own power, it ruins, and it goes though there is a start also in the star. ---Finite.
  4. * Only the person who was wisdom can read the most foolish one from the history.
  5. * The fish that lives in the sea doesn't know the world in the land.
  6. * It also ruins and goes if they have wisdom.
  7. * It is funnier that man exceeds the speed of light than fish start living in the land.
  8. * It can be said that this is an final ultimatum from the god to the people who can fight.
  9. *
  10. * Steins;Gate
  11. */
  12.  
  13. #include <bits/stdc++.h>
  14.  
  15. typedef long long LL;
  16. const int N = , MO = ;
  17.  
  18. int n, K, q, g[N][N], f[N], pw[N];
  19.  
  20. inline int qpow(int a, int b) {
  21. int ans = ;
  22. while(b) {
  23. if(b & ) ans = 1ll * ans * a % MO;
  24. a = 1ll * a * a % MO;
  25. b = b >> ;
  26. }
  27. return ans;
  28. }
  29.  
  30. inline int cal(int k) {
  31. if(k < ) return ;
  32. if(k == ) return qpow( - q + MO, n);
  33. memset(f, , sizeof(f));
  34. memset(g, , sizeof(g));
  35.  
  36. for(int i = ; i <= k + ; i++) {
  37. g[][i] = ;
  38. }
  39.  
  40. for(int i = ; i <= k; i++) {
  41. for(int j = k / i; j >= ; j--) {
  42. /// g[i][j]
  43. g[i][j] = g[i][j + ];
  44. for(int p = ; p <= i; p++) {
  45. (g[i][j] += 1ll * g[p - ][j + ] * g[i - p][j] % MO * pw[j] % MO * ( - q + MO) % MO) %= MO;
  46. }
  47. //printf("g %d %d = %d \n", i, j, g[i][j]);
  48. }
  49. }
  50.  
  51. //puts("");
  52.  
  53. /// cal f
  54. f[] = ;
  55. for(int i = ; i <= n; i++) {
  56. /// f[i]
  57. if(i <= k) f[i] = g[i][];
  58. for(int j = std::max(, i - k); j <= i; j++) {
  59. (f[i] += 1ll * f[j - ] * ( - q + MO) % MO * g[i - j][] % MO) %= MO;
  60. }
  61. //printf("f %d = %d \n", i, f[i]);
  62. }
  63.  
  64. //printf("\n\n");
  65.  
  66. return f[n];
  67. }
  68.  
  69. /*
  70. 2 2 1 2
  71. */
  72.  
  73. int main() {
  74. int x, y;
  75. scanf("%d%d%d%d", &n, &K, &x, &y);
  76. q = 1ll * x * qpow(y, MO - ) % MO;
  77. //printf("q = %d \n", q);
  78. pw[] = ;
  79. for(int i = ; i <= K; i++) {
  80. pw[i] = 1ll * pw[i - ] * q % MO;
  81. }
  82.  
  83. if(n == ) {
  84. int ans = 1ll * qpow(q, K) * ( - q + MO) % MO;
  85. printf("%d\n", ans);
  86. return ;
  87. }
  88.  
  89. int ans = (cal(K) - cal(K - ) + MO) % MO;
  90. printf("%d\n", ans);
  91.  
  92. return ;
  93. }

70分代码

于是我们来个矩阵快速幂优化,获得了90分的好成绩!

  1. #include <bits/stdc++.h>
  2.  
  3. typedef long long LL;
  4. const int N = , MO = ;
  5.  
  6. int n, K, q, g[N][N], f[N], pw[N];
  7. int A[][], ANS[][], C[][];
  8.  
  9. inline int qpow(int a, int b) {
  10. int ans = ;
  11. while(b) {
  12. if(b & ) ans = 1ll * ans * a % MO;
  13. a = 1ll * a * a % MO;
  14. b = b >> ;
  15. }
  16. return ans;
  17. }
  18.  
  19. inline void mulself(int k) {
  20. memset(C, , sizeof(C));
  21. for(int p = ; p <= k; p++) {
  22. for(int j = ; j <= k; j++) {
  23. for(int i = ; i <= k; i++) {
  24. (C[i][j] += 1ll * A[i][p] * A[p][j] % MO) %= MO;
  25. }
  26. }
  27. }
  28. memcpy(A, C, sizeof(A));
  29. return;
  30. }
  31.  
  32. inline void mul(int k) {
  33. memset(C, , sizeof(C));
  34. for(int p = ; p <= k; p++) {
  35. for(int j = ; j <= k; j++) {
  36. for(int i = ; i <= k; i++) {
  37. (C[i][j] += 1ll * ANS[i][p] * A[p][j] % MO) %= MO;
  38. }
  39. }
  40. }
  41. memcpy(ANS, C, sizeof(C));
  42. return;
  43. }
  44.  
  45. inline int cal(int k) {
  46. if(k < ) return ;
  47. if(k == ) return qpow( - q + MO, n);
  48. memset(f, , sizeof(f));
  49. memset(g, , sizeof(g));
  50.  
  51. for(int i = ; i <= k + ; i++) {
  52. g[][i] = ;
  53. }
  54.  
  55. for(int i = ; i <= k; i++) {
  56. for(int j = k / i; j >= ; j--) {
  57. /// g[i][j]
  58. g[i][j] = g[i][j + ];
  59. for(int p = ; p <= i; p++) {
  60. (g[i][j] += 1ll * g[p - ][j + ] * g[i - p][j] % MO * pw[j] % MO * ( - q + MO) % MO) %= MO;
  61. }
  62. //printf("g %d %d = %d \n", i, j, g[i][j]);
  63. }
  64. }
  65.  
  66. //puts("");
  67.  
  68. /// cal f
  69. if(n <= ) {
  70. f[] = ;
  71. for(int i = ; i <= n; i++) {
  72. /// f[i]
  73. if(i <= k) f[i] = g[i][];
  74. for(int j = std::max(, i - k); j <= i; j++) {
  75. (f[i] += 1ll * f[j - ] * ( - q + MO) % MO * g[i - j][] % MO) %= MO;
  76. }
  77. //printf("f %d = %d \n", i, f[i]);
  78. }
  79. return f[n];
  80. }
  81. else {
  82. memset(ANS, , sizeof(ANS));
  83. for(int i = ; i <= k; i++) {
  84. ANS[i][i] = ;
  85. }
  86. memset(A, , sizeof(A));
  87. for(int i = ; i < k; i++) {
  88. A[i + ][i] = ;
  89. }
  90. for(int i = ; i <= k; i++) {
  91. A[i][k] = 1ll * g[k - i][] * ( - q + MO) % MO;
  92. }
  93. int b = n - k;
  94. while(b) {
  95. if(b & ) {
  96. mul(k);
  97. }
  98. mulself(k);
  99. b = b >> ;
  100. }
  101. /// mul g ans
  102. int ans = ;
  103. for(int i = ; i <= k; i++) {
  104. (ans += 1ll * g[i][] * ANS[i][k] % MO) %= MO;
  105. }
  106. return ans;
  107. }
  108. }
  109.  
  110. /*
  111. 2 2 1 2
  112. */
  113.  
  114. int main() {
  115. int x, y;
  116. scanf("%d%d%d%d", &n, &K, &x, &y);
  117. q = 1ll * x * qpow(y, MO - ) % MO;
  118. //printf("q = %d \n", q);
  119. pw[] = ;
  120. for(int i = ; i <= K; i++) {
  121. pw[i] = 1ll * pw[i - ] * q % MO;
  122. }
  123.  
  124. if(n == ) {
  125. int ans = 1ll * qpow(q, K) * ( - q + MO) % MO;
  126. printf("%d\n", ans);
  127. return ;
  128. }
  129.  
  130. int ans = (cal(K) - cal(K - ) + MO) % MO;
  131. printf("%d\n", ans);
  132.  
  133. return ;
  134. }

90分代码

弃疗了弃疗了...

LOJ#2304 泳池的更多相关文章

  1. LOJ 2304 「NOI2017」泳池——思路+DP+常系数线性齐次递推

    题目:https://loj.ac/problem/2304 看了各种题解…… \( dp[i][j] \) 表示有 i 列.第 j 行及以下默认合法,第 j+1 行至少有一个非法格子的概率,满足最大 ...

  2. LOJ#2304. 「NOI2017」泳池

    $n \leq 1e9$底边长的泳池,好懒啊泥萌自己看题吧,$k \leq 1000$.答案对998244353取膜. 现在令$P$为安全,$Q$为危险的概率.刚好$K$是极其不好算的,于是来算$\l ...

  3. [Noi2016]区间 BZOJ4653 洛谷P1712 Loj#2086

    额... 首先,看到这道题,第一想法就是二分答案+线段树... 兴高采烈的认为我一定能AC,之后发现n是500000... nlog^2=80%,亲测可过... 由于答案是求满足题意的最大长度-最小长 ...

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

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

  5. Loj #3096. 「SNOI2019」数论

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

  6. Loj #3093. 「BJOI2019」光线

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

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

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

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

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

  9. Loj #2331. 「清华集训 2017」某位歌姬的故事

    Loj #2331. 「清华集训 2017」某位歌姬的故事 IA 是一名会唱歌的女孩子. IOI2018 就要来了,IA 决定给参赛选手们写一首歌,以表达美好的祝愿.这首歌一共有 \(n\) 个音符, ...

随机推荐

  1. Yii2设计模式——单例模式

    应用举例 在Yii.php中: require __DIR__ . '/BaseYii.php'; // Yii框架的帮助类,提供框架基本的功能 class Yii extends \yii\Base ...

  2. Cesium 绘制点、线、面和测距

    本文基于ES6,采用React+Cesium的Webgis前端开发框架,目前threejs和cesium的结合正在研究中.此段代码采用原生javascript,可能过程中用到了es6的扁平化语法,如( ...

  3. 电脑获取手机文件的一种方式(通过手机建立ftp)

    1 打开手机热点. 2 手机需要安装es文件浏览器,在es浏览器首页有个远程管理(或在左侧网络功能下有个远程管理),打开即可启用手机目录下的ftp. 3 打开电脑按提示输入ftp站点.默认地址是手机热 ...

  4. Spring WebFlux 响应式编程学习笔记(一)

    各位Javaer们,大家都在用SpringMVC吧?当我们不亦乐乎的用着SpringMVC框架的时候,Spring5.x又悄(da)无(zhang)声(qi)息(gu)的推出了Spring WebFl ...

  5. Win7系统下,docker构建nginx+php7环境实践

    前面两章介绍的是Windows系统下如何安装和配置docker,主要原因在于,公司大多人数用的是Windows环境,想通过在Windows环境上,通过docker,构建一个公用的配置. 首先要说明的是 ...

  6. java 易错选择题 编辑中

    1 System.out.println(int(a+b)); 编译错误  应该是(int)(a+b) 2 String s="john"+3; 是正确的,结果就是 john3 3 ...

  7. #035 大数阶乘 PTA题目6-10 阶乘计算升级版 (20 分)

    实际题目 本题要求实现一个打印非负整数阶乘的函数. 函数接口定义: void Print_Factorial ( const int N ); 其中N是用户传入的参数,其值不超过1000.如果N是非负 ...

  8. Vue-cli在webpack内使用雪碧图(响应式)

    先执行install cnpm install webpack-spritesmith 文件位置 build\webpack.dev.conf.js 添加内容: const SpritesmithPl ...

  9. 关键字-this

    1.当成员变量和局部变量重名时,在方法中使用this时,this指向的是该方法所在类的成员变量. package gc.test.java.cs1; public class User{ public ...

  10. Maps JavaScript API的JavaScript代码

    要请求多个库,请用逗号分隔它们   <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY& ...