题目描述

有一个长为\(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;
}

转载于:https://www.cnblogs.com/ZH-comld/p/10461183.html

[NOI2017]泳池相关推荐

  1. NOI2010~NOI2018选做

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

  2. 「NOI2017」泳池

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

  3. [NOI2017]游戏(2-SAT)

    这是约半年前写的题解了,就搬过来吧 感觉这是NOI2017最水的一题(当然我还是不会2333),因为是一道裸的2-SAT.我就是看着这道题学的2-SAT 算法一:暴力枚举.对于abc二进制枚举,对于x ...

  4. loj #2305. 「NOI2017」游戏

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

  5. P3825 [NOI2017]游戏

    P3825 [NOI2017]游戏 题目描述 小 L 计划进行n场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. 小 L 的赛车有三辆,分别用大写字母A.B.C表示.地图一共有四 ...

  6. 泳池里到底有多少排泄物?

    每次游泳的时候, 多多少少都会暗自好奇 泳池里究竟有多少尿...? 如今这个可怕的问题得到了解答...... class="video_iframe" frameborder=&q ...

  7. java圆形泳池问题_Java实现 LeetCode 778 水位上升的泳池中游泳(二分+DFS)

    778. 水位上升的泳池中游泳 在一个 N x N 的坐标方格 grid 中,每一个方格的值 grid[i][j] 表示在位置 (i,j) 的平台高度. 现在开始下雨了.当时间为 t 时,此时雨水导致 ...

  8. 计算机音乐植物大战僵尸泳池,植物大战僵尸(泳池)

    Introduction "植物大战僵尸(泳池)" is a MIDI music piece in Anime/game music style, played by an en ...

  9. es6 取数组的第一个和最后一个_全球最恐怖的3个泳池,第一个有10层楼高,最后一个听名字就害怕...

    在这个炎热的天气中,大家最喜欢的运动就不是跑步了,而是游泳,不仅可以锻炼身体,还能消暑,但说到游泳,秋天的时候我们还可以轻易海中或者是湖中游泳,这样不容易被晒黑,但在夏天的时候就不行了,所以游泳的最佳 ...

最新文章

  1. 团队冲刺(二)个人工作总结9
  2. golang常见字符串操作函数
  3. C语言再学习 -- 结构和其他数据形式
  4. TypeScript--泛型
  5. Master of GCD(差分数组||线段树)
  6. B-JUI文档、下载
  7. oracle ssl jdbc 架构,我与数据库的JDBC连接是否使用SSL?
  8. JDBC中给Mysql加时区问题!
  9. Eureka/Zookeeper/Consul三种注册中心的区别
  10. plc通过无线通讯连接服务器,多个plc无线通讯方案
  11. DWS自动化包裹称重扫码测体积快手台的开发和源码
  12. linux kernel directory
  13. 如何在word中批量编辑所有图片的大小?
  14. C++ 制作FlappyBird
  15. php实现简单微信支付(提供商户微信)
  16. 程序员怎么提高英语阅读水平?
  17. android 人脸检测 对焦,Android API教程:人脸检测(上)
  18. 家用路由器 实现 Web认证
  19. 考研计算机专业课考研大纲,计算机专业课考研大纲
  20. CSS学习,Pixy图像翻转和CSS精灵

热门文章

  1. 《可穿戴创意设计:技术与时尚的融合》一一3.3 纺织与教育
  2. 思维+multiset ZOJ Monthly, July 2015 - H Twelves Monkeys
  3. CDC之CreateCompatibleDC与BitBlt
  4. LVS(MASTER---NAT)
  5. Keyword-Driven Testing
  6. java 加密解密简单实现
  7. 运维太忙?那是你还没掌握 Ansible !
  8. Nginx的rewrite之if指令(一)
  9. 经典问题:微服务和分布式的区别
  10. 初步认识Volatile-总线锁和缓存锁