将等于$k$差分,即小于等于$k$减去小于等于$k-1$,由于两者类似,不妨仅考虑前者

令$f_{i,j}$表示仅考虑$i$列(即$n=i$时),若前$j$行都没有障碍,此时最大面积小于等于$k$的概率

考虑转移,对第$j+1$行是否有障碍分类讨论,并在有障碍时枚举最左边的障碍,即
$$
f_{i,j}=\begin{cases}q^{i}f_{i,j+1}+\sum_{t=1}^{i}(1-q)q^{t-1}f_{t-1,j+1}f_{i-t,j}&(ij\le k)\\0&(ij>k)\end{cases}
$$
初始状态为$f_{0,j}=1$,接下来根据此式子,求出$i,j\ge 1$且$ij\le k$或$j=0$且$i\le k$的$f_{i,j}$,由于这样的状态数是$o(k\log k)$的,总复杂度即为$o(k^{2}\log k)$

接下来,考虑$i>k$且$j=0$时的式子,去掉其中为0的项,即
$$
f_{i,0}=\sum_{t=1}^{k+1}(1-q)q)^{t-1}f_{t-1,1}f_{i-t,0}f_{i,0}=\sum_{t=1}^{k+1}(1-q)q^{t-1}f_{t-1,1}f_{i-t,0}
$$
记$g_{t}=(1-q)q^{t-1}f_{t-1,1}$,即为常数,预处理后即递推式$f_{i,0}=\sum_{t=1}^{k+1}g_{t}f_{i-t,0}$

对于一个多项式$F$,令$G(F)=\sum_{i=0}^{\infty}f_{i,0}[x^{i}]F$(后者即指$F$的$i$次项系数),问题即求$G(x^{n})$

注意到对于函数$G$,有以下两个性质:

1.$G((x^{k+1}-\sum_{i=1}^{k+1}g_{i}x^{k-i+1})x^{t})=f_{t+k+1,0}-\sum_{i=0}^{k}g_{i}f_{t+k+1-i,0}=0$

(即$i=k+t+1$时的递推式,因此显然相等)

2.$G(F_{1})+G(F_{2})=G(F_{1}+F_{2})$,代入即成立

综上,构造$A(x)=x^{k+1}-\sum_{i=1}^{k+1}g_{i}x^{k-i+1}$,设$x^{n}=A(x)B(x)+R(x)$,即有
$$
G(x^n)=G(AB)+G(R)=\sum_{i=0}^{\infty}[x^{i}]B\cdot G(Ax^{i})+G(R)=G(R)
$$
换言之,问题即求$R(x)\equiv x^{n}(mod\ A(x))$,再求$G(R)$即可

若$R_{0}(x)\equiv x^{m}(mod\ A(X))$,即有$R_{0}^{2}(x)\equiv x^{2m}(mod\ A(x))$和$xR_{0}(x)\equiv x^{m+1}(mod\ A(x))$,由此进行迭代即可,复杂度为$o(k^{2}\log k)$(即暴力计算$R_{0}^{2}(x)$)或$o(k\log^{2}k)$(使用ntt计算$R_{0}^{2}(x)$)

综上,总复杂度即$o(k^{2}\log k)$,可以通过

  1. 1 #include<bits/stdc++.h>
  2. 2 using namespace std;
  3. 3 #define N 1005
  4. 4 #define mod 998244353
  5. 5 int n,k,x,y,p,mi[N],A[N],R[N],RR[N<<1],g[N],f[N][N];
  6. 6 int pow(int n,int m){
  7. 7 int s=n,ans=1;
  8. 8 while (m){
  9. 9 if (m&1)ans=1LL*ans*s%mod;
  10. 10 s=1LL*s*s%mod;
  11. 11 m>>=1;
  12. 12 }
  13. 13 return ans;
  14. 14 }
  15. 15 void solve(int n,int k){
  16. 16 if (!n){
  17. 17 memset(R,0,sizeof(R));
  18. 18 R[0]=1;
  19. 19 return;
  20. 20 }
  21. 21 solve((n>>1),k);
  22. 22 memset(RR,0,sizeof(RR));
  23. 23 for(int i=0;i<=k;i++)
  24. 24 for(int j=0;j<=k;j++)RR[i+j]=(RR[i+j]+1LL*R[i]*R[j])%mod;
  25. 25 for(int i=2*k;i>k;i--){
  26. 26 for(int j=1;j<=k+1;j++)RR[i-j]=(RR[i-j]-1LL*A[k+1-j]*RR[i]%mod+mod)%mod;
  27. 27 RR[i]=0;
  28. 28 }
  29. 29 memcpy(R,RR,sizeof(R));
  30. 30 if (n&1){
  31. 31 for(int i=k;i>=0;i--)R[i+1]=R[i];
  32. 32 R[0]=0;
  33. 33 for(int i=1;i<=k+1;i++)R[k+1-i]=(R[k+1-i]-1LL*A[k+1-i]%mod*R[k+1]%mod+mod)%mod;
  34. 34 R[k+1]=0;
  35. 35 }
  36. 36 }
  37. 37 int calc(int k){
  38. 38 memset(f,0,sizeof(f));
  39. 39 for(int i=0;i<=k+1;i++)f[0][i]=1;
  40. 40 for(int i=1;i<=k;i++)
  41. 41 for(int j=k/i;j>=0;j--){
  42. 42 f[i][j]=1LL*mi[i]*f[i][j+1]%mod;
  43. 43 for(int t=1;t<=i;t++)f[i][j]=(f[i][j]+1LL*(mod+1-p)*mi[t-1]%mod*f[t-1][j+1]%mod*f[i-t][j])%mod;
  44. 44 }
  45. 45 for(int i=1;i<=k+1;i++)g[i]=1LL*(mod+1-p)*mi[i-1]%mod*f[i-1][1]%mod;
  46. 46 A[k+1]=1;
  47. 47 for(int i=1;i<=k+1;i++)A[k-i+1]=mod-g[i];
  48. 48 solve(n,k);
  49. 49 int ans=0;
  50. 50 for(int i=0;i<=k;i++)ans=(ans+1LL*f[i][0]*R[i])%mod;
  51. 51 return ans;
  52. 52 }
  53. 53 int main(){
  54. 54 scanf("%d%d%d%d",&n,&k,&x,&y);
  55. 55 p=1LL*x*pow(y,mod-2)%mod;
  56. 56 mi[0]=1;
  57. 57 for(int i=1;i<=k;i++)mi[i]=1LL*mi[i-1]*p%mod;
  58. 58 printf("%d",(calc(k)-calc(k-1)+mod)%mod);
  59. 59 }

[loj2304]泳池的更多相关文章

  1. 「NOI2017」泳池

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

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

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

  3. upc组队赛1 不存在的泳池【GCD】

    不存在的泳池 题目描述 小w是云南中医学院的同学,有一天他看到了学校的百度百科介绍: 截止到2014年5月,云南中医学院图书馆纸本藏书74.8457万册,纸质期刊388种,馆藏线装古籍图书1.8万册, ...

  4. UOJ#316. 【NOI2017】泳池

    传送门 一道 \(DP\) 好题 设 \(q\) 为一个块合法的概率 套路一恰好为 \(k\) 的概率不好算,算小于等于 \(k\) 的减去小于等于 \(k-1\) 的 那么设 \(f_i\) 表示宽 ...

  5. 泳池迷宫(p24)

    /*2018年8月26日15:55:29作者:冰樱梦page-24泳池迷宫*/public class swiming{public static void main(String[] args){i ...

  6. BZOJ4944: [Noi2017]泳池

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

  7. LOJ#2304. 「NOI2017」泳池

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

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

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

  9. 修建泳池&最大子矩阵

    [题目描述] 夏天到了,学校打算在教学楼后面的空地上挖一个泳池供大家使用. 经过实地勘察,这块土地可以划分成N 行M 列的方格,有的方格是树,有的方格是空地.现在要找一块最大的矩形空地修建泳池,请问泳 ...

随机推荐

  1. C++优化列表

    #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize("Ofast") #pragma GCC ...

  2. bzoj1067——SCOI2007降雨量(线段树,细节题)

    题目描述 我们常常会说这样的话:"X年是自Y年以来降雨量最多的".它的含义是X年的降雨量不超过Y年,且对于任意\(Y<Z<X\),Z年的降雨量严格小于X年.例如2002 ...

  3. ls命令剖析

    目录 ls命令剖析 资料翻译 SYNOPSIS 使用方式 DESCRIPTION 说明 参数的说明 -l 参数字符的解释 文件权限的解释 FILES 文件夹 实战演练 ls 命令 ls -l 命令 l ...

  4. Android QMUI实战:实现APP换肤功能,并自动适配手机深色模式

    Android换肤功能已不是什么新鲜事了,市面上有很多第三方的换肤库和实现方案. 之所以选择腾讯的QMUI库来演示APP的换肤功能,主要原因: 1.换肤功能的实现过程较简单.容易理解: 2.能轻松适配 ...

  5. 函数返回值为 const 指针、const 引用

    函数返回值为 const 指针,可以使得外部在得到这个指针后,不能修改其指向的内容.返回值为 const 引用同理. class CString { private: char* str; publi ...

  6. DataX的安装及使用

    DataX的安装及使用 目录 DataX的安装及使用 DataX的安装 DataX的使用 stream2stream 编写配置文件stream2stream.json 执行同步任务 执行结果 mysq ...

  7. 【UE4 设计模式】享元模式 Flyweight Pattern

    概述 描述 运用共享技术有效地支持大量细粒度对象的复用.系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用. 由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻 ...

  8. MySQL:基础语法-2

    MySQL:基础语法-2 记录一下 MySQL 基础的一些语法,便于查询,该部分内容主要是参考:bilibili 上 黑马程序员 的课程而做的笔记,由于时间有点久了,课程地址忘记了 上文MySQL:基 ...

  9. 正则表达式: NFA引擎匹配原理

    NFA引擎匹配原理 1       为什么要了解引擎匹配原理 一个个音符杂乱无章的组合在一起,弹奏出的或许就是噪音,同样的音符经过作曲家的手,就可以谱出非常动听的乐曲,一个演奏者同样可以照着乐谱奏出动 ...

  10. Scrum Meeting 0509

    零.说明 日期:2021-5-9 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 qsy PM&前端 测试 测试 cyy ...