题目描述

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

题解

我们可以考虑设一个\(dp\)。

我们定义每一列的高度为这一列最高的位置满足这个位置及以下的位置都为1。

设\(dp[i][j]\)表示已经做到了前\(i\)列,此时最低的位置为\(j\)并且此时的最大价值不超过\(K\)的概率。

可以看出这是一个前缀和的形式,我们需要在最外面用\(K\)的答案减去\(K-1\)的答案来得到最终的答案。

那么我们的\(dp\)转移可以枚举最靠前的一列满足\(j+1\)处是0的列。

那么转移为:

\(dp[i][j]=[i\times j\leq K](1-p)p^j\sum_{x=1}^i\Bigl( (\sum_{k\geq j+1}dp[x-1][k])\times(\sum_{l\geq j}dp[i-x][l])\Bigr)\)

我们要求的答案为\(dp[n][0]\)。

后面的两个求和部分可以发现是一个后缀和形式,考虑用后缀和优化转移。

比如说我们已经算完了等号右边的部分,我们可以把它加到\(dp[i][l](l\leq j)\)就可以了。

前面枚举\(i\),然后枚举\(K/i\),再去枚举\(i\),总的复杂度为\(K^2\)。

我们发现\(n​\)非常大,所以我们需要发现一些别的性质。

发当\(n\geq k\)时,第二维只能为0,所以我们令\(g[n]=dp[n][0]\)。

\[g[n]=(1-p)\sum_{i=1}^{i\leq K+1}dp[i-1][1]\times g[n-i]
\]

\[g[n]=\sum_{i=1}^{i\leq K+1}(dp[i-1][1]\times (1-p))\times g[n-i]
\]

这样我们把它转化为一个\(K+1\)次的常系数齐次线性递推。

可以用矩阵乘法优化为\(O(K^3logn)\),期望得分90,使用多项式取模可以优化至\(O(K^2logn)\sim(KlogKlogn)\)期望得分100。

注意特判\(K=0\)。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#define N 1009
using namespace std;
typedef long long ll;
const int mod=998244353;
int pos,k,n;
ll tmp[N<<1],p[N],dp[N][N],P,y,now[N],num[N],ans[N];
inline ll rd(){
ll x=0;char c=getchar();bool f=0;
while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return f?-x:x;
}
inline ll power(ll x,ll y){
ll ans=1;
while(y){if(y&1)ans=ans*x%mod;x=x*x%mod;y>>=1;}
return ans;
}
inline void MOD(ll &x){while(x>=mod)x-=mod;}
inline void mul(ll *a,ll *b,ll *c){
for(int i=0;i<=2*pos;++i)tmp[i]=0;
for(int i=0;i<pos;++i)
for(int j=0;j<pos;++j)(tmp[i+j]+=a[i]*b[j]%mod)%=mod;
for(int i=2*pos-2;i>=pos;--i){
for(int j=0;j<pos;++j)tmp[i-pos+j]=(tmp[i-pos+j]-tmp[i]*p[j]%mod+mod)%mod;
tmp[i]=0;
}
for(int i=0;i<pos;++i)c[i]=tmp[i];
}
inline ll calc(int k){
if(!k){return power(1-P+mod,n);}
memset(dp,0,sizeof(dp));
memset(num,0,sizeof(num));
memset(ans,0,sizeof(ans));
for(int i=0;i<=k+1;++i)dp[0][i]=1;
for(int i=1;i<=k;++i)
for(int j=0;i*j<=k;++j){
ll sum=0;
for(int x=1;x<=i;++x)(sum=sum+dp[x-1][j+1]*dp[i-x][j]%mod)%=mod;
sum=sum*power(P,j)%mod*(1+mod-P)%mod;
for(int x=0;x<=j;++x)(dp[i][x]+=sum)%=mod;
}
k++;pos=k;
for(int i=1;i<=k;++i)now[i]=dp[i-1][1]*(mod+1-P)%mod;
for(int i=1;i<=k;++i)p[k-i]=mod-now[i];
num[1]=1;ans[0]=1;
int nn=n;
while(nn){
if(nn&1)mul(ans,num,ans);
mul(num,num,num);nn>>=1;
}
ll res=0;
for(int i=0;i<k;++i)MOD(res+=ans[i]*dp[i][0]%mod);
return res;
}
int main(){
n=rd();k=rd();P=rd();y=rd();P=P*power(y,mod-2)%mod;
printf("%lld",(calc(k)-calc(k-1)+mod)%mod);
return 0;
}

[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. Luogu3824 [NOI2017]泳池 【多项式取模】【递推】【矩阵快速幂】

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

  5. [学习笔记]Cayley-Hilmiton

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

  6. NOI2010~NOI2018选做

    [NOI2010] [NOI2010]海拔 高度只需要0/1,所以一个合法方案就是一个割,平面图求最小割. [NOI2010]航空管制 反序拓扑排序,每次取出第一类限制最大的放置,这样做答案不会更劣. ...

  7. UOJ#316. 【NOI2017】泳池

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

  8. LOJ#2304. 「NOI2017」泳池

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

  9. 「NOI2017」泳池

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

随机推荐

  1. oracle锁表与解表

    查看锁表进程SQL语句1: select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo ...

  2. SpringBoot 2.0 mybatis mapper通用类

    <!---mybatis通用类包含mybatis和连接池 mybatis和连接池就不需要引入--> <dependency> <groupId>tk.mybatis ...

  3. Django学习之七:Django 中间件

    目录 Django 中间件 自定义中间件 - - - 大体两种方式 将中间件移除 实例 中间件加载源码阅读 总结 Django 中间件 Tips: 更新日志: 2019.01.31 更新django中 ...

  4. 微信小程序 canvas 文字居中

    drawCanvas: function(ctx) { //... // 昵称 ctx.setFontSize(16) //字体大小 ctx.setFillStyle('#fff') //字体颜色 c ...

  5. WebGL或OpenGL关于模型视图投影变换的设置技巧

    目录 1. 具体实例 2. 解决方案 1) Cube.html 2) Cube.js 3) 运行结果 3. 详细讲解 1) 模型变换 2) 视图变换 3) 投影变换 4) 模型视图投影矩阵 4. 存在 ...

  6. 业务与IT技术

    最近听一个同事又再次提问关于业务比技术重要,是真的吗? 今天我们再来看一下.      一,什么是业务? 业务意指某种有目的的工作或工作项目.技术可以指人类对机器.硬件或人造器皿的运用,但它也可以包含 ...

  7. spring boot整合Hadoop

    最近需要用spring boot + mybatis整合hadoop,其中也有碰到一些坑,记录下来方便后面的人少走些弯路. 背景呢是因为需要在 web 中上传文件到 hdfs ,所以需要在spring ...

  8. SQL 行转列 PIVOT 学习示例

    CREATE TABLE [StudentScores] ( ), --学生姓名 ), --科目 [Score] FLOAT, --成绩 ) select * from [StudentScores] ...

  9. PostgreSQL For Windows 全功能精简版

    预览 精简部分 保留全部 PostgreSQL 相关功能 删除自带的 pgadmin 4 删除文档 删除开发用头文件 删除开发用静态连接库 删除 Stack Build 工具 写了一个管理数据库用的批 ...

  10. jquery各大学选择插件

    地址:http://www.jq22.com/jquery-info5565 演示地址:http://www.jq22.com/yanshi5565