传送门

一道 \(DP\) 好题

设 \(q\) 为一个块合法的概率

套路一恰好为 \(k\) 的概率不好算,算小于等于 \(k\) 的减去小于等于 \(k-1\) 的

那么设 \(f_i\) 表示宽为 \(i\) 的合法的泳池面积都小于等于 \(k\) 的概率

设 \(g_i\) 表示宽为 \(i\) 的合法的泳池面积都小于等于 \(k\) 且最下面一行都合法的概率

那么考虑转移 \(f\)

套路二强制前面的满足一定的性质,后面接一段不满足的

首先 \(f_i+=g_i\),然后枚举放一个不合法的块在最下面

那么贡献就是 \(\sum_{j=0}^{i-1}f_{i-j-1}g_j(1-q)\)

考虑怎么得到 \(g\),考虑到 \(g\) 表示的一定是下面都合法,上面是一个不合法的轮廓线的状态

那么枚举轮廓线的最下面的点

设 \(dp_{i,j}\) 表示宽为 \(i\) 最下面一行都合法,且向上第一个不合法的高度为 \(j+1\) 的概率

仍然用套路二转移

首先 \(i\times j \le k\)

\(dp_{i,j}=(1-q)q^j\sum_{l=1}^{i-1}(\sum_{x\ge j}dp_{l-1,x})(\sum_{x>j}dp_{i-l,x})\)

显然有用的状态只有 \(\Theta(klnk)\),然后前缀和优化做到 \(\Theta(k^2lnk)\)

直接这样子写就有 \(70\) 分

观察这个东西

\(g_i+\sum_{j=0}^{i-1}f_{i-j-1}g_j(1-q)\)

就是个常系数齐次线性递推的形式

套用线性递推即可

  1. # include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int maxn(1005);
  5. const int mod(998244353);
  6. inline void Inc(int &x, int y) {
  7. x = x + y >= mod ? x + y - mod : x + y;
  8. }
  9. inline int Pow(ll x, int y) {
  10. register ll ret = 1;
  11. for (; y; y >>= 1, x = x * x % mod)
  12. if (y & 1) ret = ret * x % mod;
  13. return ret;
  14. }
  15. int f[maxn], g[maxn], dp[maxn][maxn], n, pw[maxn], q;
  16. int p[maxn], tmp[maxn << 1], a[maxn], b[maxn];
  17. inline void Mul(int *x, int *y, int *z, int k) {
  18. register int i, j, inv, t = k << 1;
  19. memset(tmp, 0, sizeof(tmp));
  20. for (i = 0; i < k; ++i)
  21. for (j = 0; j < k; ++j) Inc(tmp[i + j], (ll)x[i] * y[j] % mod);
  22. for (i = t; i >= k; --i)
  23. if (tmp[i])
  24. for (inv = tmp[i], j = 0; j <= k; ++j) Inc(tmp[i - j], mod - (ll)p[k - j] * inv % mod);
  25. for (i = 0; i < k; ++i) z[i] = tmp[i];
  26. }
  27. inline int Solve(int k) {
  28. if (!k) return Pow(q, n);
  29. memset(dp, 0, sizeof(dp)), memset(f, 0, sizeof(f));
  30. register int i, j, l, ans = 0;
  31. for (i = 0; i <= 1001; ++i) dp[0][i] = 1;
  32. for (i = 1; i <= k; ++i)
  33. for (j = k / i; j; --j) {
  34. for (l = 1; l <= i; ++l) Inc(dp[i][j], (ll)dp[l - 1][j] * dp[i - l][j + 1] % mod);
  35. dp[i][j] = (ll)q * pw[j] % mod * dp[i][j] % mod;
  36. Inc(dp[i][j], dp[i][j + 1]);
  37. }
  38. for (i = 0; i <= k; ++i) g[i + 1] = (ll)q * dp[i][1] % mod, f[i] = dp[i][1];
  39. for (i = 1; i <= k; ++i)
  40. for (j = 1, l = min(i, k + 1); j <= l; ++j) Inc(f[i], (ll)f[i - j] * g[j] % mod);
  41. memset(p, 0, sizeof(p)), memset(a, 0, sizeof(a)), memset(b, 0, sizeof(b));
  42. for (p[++k] = 1, i = 0; i < k; ++i) p[i] = mod - g[k - i];
  43. a[0] = b[1] = 1;
  44. for (i = n; i; i >>= 1, Mul(b, b, b, k))
  45. if (i & 1) Mul(a, b, a, k);
  46. for (i = 0; i < k; ++i) Inc(ans, (ll)a[i] * f[i] % mod);
  47. return ans;
  48. }
  49. int k;
  50. int main() {
  51. register int x, y, i;
  52. scanf("%d%d%d%d", &n, &k, &x, &y);
  53. pw[0] = 1, pw[1] = (ll)x * Pow(y, mod - 2) % mod, q = (mod + 1 - pw[1]) % mod;
  54. for (i = 2; i <= 1000; ++i) pw[i] = (ll)pw[i - 1] * pw[1] % mod;
  55. printf("%d\n", (Solve(k) - Solve(k - 1) + mod) % mod);
  56. return 0;
  57. }

UOJ#316. 【NOI2017】泳池的更多相关文章

  1. [NOI2017]泳池——概率DP+线性递推

    [NOI2017]泳池 实在没有思路啊~~~ luogu题解 1.差分,转化成至多k的概率减去至多k-1的概率.这样就不用记录“有没有出现k”这个信息了 2.n是1e9,感觉要递推然后利用数列的加速技 ...

  2. BZOJ4944: [Noi2017]泳池

    BZOJ4944: [Noi2017]泳池 题目背景 久莲是个爱玩的女孩子. 暑假终于到了,久莲决定请她的朋友们来游泳,她打算先在她家的私人海滩外圈一块长方形的海域作为游泳场. 然而大海里有着各种各样 ...

  3. 【BZOJ4944】[NOI2017]泳池(线性常系数齐次递推,动态规划)

    [BZOJ4944][NOI2017]泳池(线性常系数齐次递推,动态规划) 首先恰好为\(k\)很不好算,变为至少或者至多计算然后考虑容斥. 如果是至少的话,我们依然很难处理最大面积这个东西.所以考虑 ...

  4. UOJ#316. 【NOI2017】泳池 动态规划,Berlekamp-Massey,Cayley-Hamilton定理

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ316.html 题解 首先,我们将答案转化成最大矩形大小 \(\leq k\) 的概率 减去 \(\leq k-1\) 的 ...

  5. BZOJ 4945 UOJ #317 NOI2017 游戏 2-SAT 拓扑排序

    http://uoj.ac/problem/317 https://www.lydsy.com/JudgeOnline/problem.php?id=4945 我现在的程序uoj的额外数据通过不了,b ...

  6. [NOI2017]泳池

    题目描述 有一个长为\(n\),高为1001的网格,每个格子有\(p\)的概率为1,\((1-p)\)的概率0,定义一个网格的价值为极大的全一矩形,且这个矩形的底要贴着网格的底,求这个网格的价值为\( ...

  7. Luogu3824 [NOI2017]泳池 【多项式取模】【递推】【矩阵快速幂】

    题目分析: 用数论分块的思想,就会发现其实就是连续一段的长度$i$的高度不能超过$\lfloor \frac{k}{i} \rfloor$,然后我们会发现最长的非$0$一段不会超过$k$,所以我们可以 ...

  8. 「NOI2017」泳池

    DP式子比后面的东西难推多了 LOJ2304 Luogu P3824 UOJ #316 题意 给定一个长度为$ n$高为$ \infty$的矩形 每个点有$ 1-P$的概率不可被选择 求最大的和底边重 ...

  9. [学习笔记]Cayley-Hilmiton

    Cayley–Hamilton theorem - Wikipedia 其实不是理解很透彻,,,先写上 简而言之: 是一个知道递推式,快速求第n项的方法 k比较小的时候可以用矩阵乘法 k是2000,n ...

随机推荐

  1. Objective-C Associated Objects 的实现原理

    我们知道,在 Objective-C 中可以通过 Category 给一个现有的类添加属性,但是却不能添加实例变量,这似乎成为了 Objective-C 的一个明显短板.然而值得庆幸的是,我们可以通过 ...

  2. 2. 需要对测试用的数据进行MD5加密

    import hashlib phone_num = open("D:/testdata/phone10.txt","r") out_file = open(& ...

  3. Spring集成ignite,服务发现问题

    问题: 解决办法: 修改C:\Windows\System32\drivers\etc\hosts 配置主机名和ip对应关系: 试试!

  4. 函数直接写在html页面的<script>里可以调用,但是单独放在js文件里不能调用

    1.函数直接写在页面相当于是你本页调用,所以理所应当可以调用 2.js单独文件不能调用是因为你没有引用js文件,如果引用了的话,也是可以调用的. 引用方式,你可以直接拖拽(我一般都是拖拽,因为路径准确 ...

  5. TP5 隐藏入口文件 index.php

    找到public下的.htaccess <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine ...

  6. (转)MySQL高可用解决方案

    MySQL高可用解决方案 原文:http://www.ywnds.com/?p=5565 有这么两个概念,数据库的可靠性和数据库的可用性,可靠性指的是数据可靠,而可用性指的是服务可用.但是不管是可靠性 ...

  7. springmvc执行原理及自定义mvc框架

    springmvc是spring的一部分,也是一个优秀的mvc框架,其执行原理如下: (1)浏览器提交请求经web容器(比如tomcat)转发到中央调度器dispatcherServlet. (2)中 ...

  8. SSM的XML和WEB.XML的配置

    显示层(handler/controller): request请求到springmvc的前端控制器,从处理器映射器找相应的handler(用@RequestMapping("  " ...

  9. python-Event事件处理进程同步

    #!/usr/bin/python from multiprocessing import Process,Event import os,time def A(e): print "blo ...

  10. ubuntu 16.04安装好后没声音的解决方法

    刚安装好Ubuntu16.04 后没声音,找了好多方法都不行,看到网上说通过安装pavucontrol和alsamixer调节解决,最后无意发现一个方法,总算是可以用了,在此记录一下.可能有的可以解决 ...