题目:https://loj.ac/problem/2304

看了各种题解……

\( dp[i][j] \) 表示有 i 列、第 j 行及以下默认合法,第 j+1 行至少有一个非法格子的概率,满足最大合法矩形面积 <= lm。其中第 j 行及以下的部分的贡献是 1 而不是 q 的几次方。

那么有 \( dp[i][j]=dp[i][j+1]*p^i + \sum\limits_{k=1}^{i}dp[k-1][j+1]*p^{k-1}*(1-p)*dp[i-k][j] \)

注意到当 i>k 的时候,最底下一行必然有至少一个位置是非法的。所以令 \(ans_i\) 表示 i 列的概率,有 \( ans_i = \sum\limits_{j=1}^{i}ans_{j-1}*(1-p)*dp[i-j][1]*p^{i-j} \)

\(ans_i\) 的初值就是 dp[i][0] 。注意 dp[0][*]=1 。然后可以用常系数线性齐次递推的知识优化。

注意清空数组。注意别把 n 的值真的改掉。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define ll long long
  5. using namespace std;
  6. const int N=,M=N<<,mod=;
  7. int upt(int x){while(x>=mod)x-=mod;while(x<)x+=mod;return x;}
  8. int pw(int x,int k)
  9. {int ret=;while(k){if(k&)ret=(ll)ret*x%mod;x=(ll)x*x%mod;k>>=;}return ret;}
  10.  
  11. int n,q,q2,f[N][N],bin[N],a[N],ans[M],b[M],c[M],lm;
  12. void Mul(int *u,int *v)//(lm-1)'
  13. {
  14. memset(c,,sizeof c);
  15. for(int i=;i<lm;i++)
  16. for(int j=;j<lm;j++)
  17. c[i+j]=(c[i+j]+(ll)u[i]*v[j])%mod;
  18.  
  19. for(int i=*(lm-);i>=lm;i--)
  20. if(c[i])
  21. for(int j=;j<=lm;j++)
  22. c[i-j]=(c[i-j]+(ll)c[i]*a[j])%mod;
  23. memcpy(u,c,sizeof *lm);//0~lm-1
  24. }
  25. int solve(int tmp)
  26. {
  27. lm=tmp; memset(f,,sizeof f);
  28. for(int j=;j<=lm+;j++)f[][j]=;//lm+1 not lm!!!
  29. for(int i=;i<=lm;i++)
  30. for(int j=lm/i;j>=;j--)
  31. {
  32. int tp=(ll)f[i][j+]*bin[i]%mod;
  33. for(int k=;k<=i;k++)
  34. {
  35. int ml=(ll)f[k-][j+]*f[i-k][j]%mod;
  36. ml=(ll)ml*q2%mod*bin[k-]%mod;
  37. tp=upt(tp+ml);
  38. }
  39. f[i][j]=tp;
  40. }
  41. if(n<=lm)return f[n][]; lm++;
  42.  
  43. for(int i=;i<=lm;i++)
  44. {
  45. int tp=(ll)f[i-][]*bin[i-]%mod;
  46. a[i]=(ll)tp*q2%mod;//not lm-i
  47. }
  48. memset(ans,,sizeof ans);////
  49. memset(b,,sizeof b);////
  50. ans[]=b[]=; int tn=n;//////
  51. while(tn)
  52. {
  53. if(tn&)Mul(ans,b); Mul(b,b); tn>>=;
  54. }
  55. int ret=;
  56. for(int i=;i<lm;i++)
  57. ret=(ret+(ll)ans[i]*f[i][])%mod;
  58. return ret;
  59. }
  60. int main()
  61. {
  62. int x,y,k;scanf("%d%d%d%d",&n,&k,&x,&y);
  63. q=(ll)x*pw(y,mod-)%mod; q2=upt(-q);
  64. bin[]=;
  65. for(int i=;i<=k;i++)bin[i]=(ll)bin[i-]*q%mod;
  66. printf("%d\n",upt(solve(k)-solve(k-)));
  67. return ;
  68. }

LOJ 2304 「NOI2017」泳池——思路+DP+常系数线性齐次递推的更多相关文章

  1. LOJ#2304. 「NOI2017」泳池

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

  2. LOJ 3090 「BJOI2019」勘破神机——斯特林数+递推式求通项+扩域

    题目:https://loj.ac/problem/3090 题解:https://www.luogu.org/blog/rqy/solution-p5320 1.用斯特林数把下降幂化为普通的幂次求和 ...

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

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

  4. loj #2305. 「NOI2017」游戏

    #2305. 「NOI2017」游戏 题目描述 小 L 计划进行 nnn 场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. 小 L 的赛车有三辆,分别用大写字母 AAA.BBB. ...

  5. 「NOI2017」泳池

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

  6. 【BZOJ4944】【NOI2017】泳池 概率DP 常系数线性递推 特征多项式 多项式取模

    题目大意 有一个\(1001\times n\)的的网格,每个格子有\(q\)的概率是安全的,\(1-q\)的概率是危险的. 定义一个矩形是合法的当且仅当: 这个矩形中每个格子都是安全的 必须紧贴网格 ...

  7. LOJ 6435 「PKUSC2018」星际穿越——DP+倍增 / 思路+主席树

    题目:https://loj.ac/problem/6435 题解:https://www.cnblogs.com/HocRiser/p/9166459.html 自己要怎样才能想到怎么做呢…… dp ...

  8. loj#2305. 「NOI2017」游戏 2-sat

    链接 https://loj.ac/problem/2305 https://www.luogu.org/problemnew/show/P3825 思路 3-sat神马的就不要想了,NP问题 除去x ...

  9. loj#2002. 「SDOI2017」序列计数(dp 矩阵乘法)

    题意 题目链接 Sol 质数的限制并没有什么卵用,直接容斥一下:答案 = 忽略质数总的方案 - 没有质数的方案 那么直接dp,设\(f[i][j]\)表示到第i个位置,当前和为j的方案数 \(f[i ...

随机推荐

  1. Chrome开发小技巧--浏览器控制台现写并运行js代码--snippets

    想简单等运行一段js代码,以前可能会新建一个html 里面包含script标签,或者引入一个js,然后chrome浏览器打开.这样很麻烦. 想再console控制台写,也不方便,换行处理麻烦. 基于在 ...

  2. PHP 开启错误显示并设置错误报告级别

    警告:生产环境永远都不要显示任何错误信息! 显示错误(display_errors)和错误报告(error_reporting)是两回事.PHP 脚本发生错误时,可以根据设置选择是否报告这个错误(记录 ...

  3. Nginx 模块 - ngx_http_rewrite_module

    原文地址 ngx_http_rewrite_module 模块用于通过 PCRE 正则表达式改变请求 URI,返回重定向并可以有条件地选择配置. break.if.return.rewrite 以及 ...

  4. Ecshop 商品详情页如何添加立即购买按钮

    1,加到位置 <li class="add_cart_li"> <a href="javascript:addToCart1({$goods.goods ...

  5. python学习第十四天字典的del(),pop().popitem(),clear()删除方法

    字典的每个键值 key=>value 数据类型,字典的key是唯一的,Value可以一样 names={'玖乐公司网址':‘www.96net.com.cn’,"电池网":' ...

  6. MVC与设计模式的关系及MVC的实现原理和设计原理

    1 MVC介绍 众所周知MVC不是设计模式,是一个比设计模式更大一点的模式,称作设计模式不合理,应该说MVC它是一种软件开发架构模式,它包含了很多的设计模式,最为密切是以下三种:Observer (观 ...

  7. Linux统计文件内容

    wc:统计文件的行数.单词数.字节数(word count) - wc char.txt:统计出文件char.txt的换行符个数.单词数.字节数 (char.txx有14行.13个单词.66字节) - ...

  8. 20個命令行工具監控 Linux 系統性能

    對於每個系統管理員或網路管理員來說,每天要監控和調試 Linux 系統性能問題都是非常困難的工作.我已經有5年 Linux 管理員的工作經歷,知道如何監控系統使其保持正常運行.為此,我們編寫了對於 L ...

  9. ELKStack之极速入门(上)

    ELKStack之极速入门(上) 链接:https://pan.baidu.com/s/1V2aYpB86ZzxL21Hf-AF1rA 提取码:7izv 复制这段内容后打开百度网盘手机App,操作更方 ...

  10. 在vCenter上创建新用户 (适用版本6.0)