题意:有一个1001 * n的矩形,每个位置有q的概率为1。求紧贴下边界的最大的全1子矩形面积恰为k的概率。n <= 1e9,k <= 1000。

解:只需考虑每一列最下面一个0的位置。

首先有个n = 1的部分分,答案显然就是qk(1-q)。

中间还有些部分分,什么打表啊笛卡尔树上DP啊...感觉有毒。

接下来就是一个nk的DP,直接获得70分...感觉有毒。

首先发现这个恰好为k不好处理,就考虑计算<= k和<= k - 1,然后相减。注意因为面积全是整数而我们不是求期望,所以不会有非整数的出现。

考虑到下边界一定被若干个0分隔开,且每两个相邻0之间距离不大于k。于是我们按照0来DP。设fi表示1001 * i的矩形符合条件的概率。那么每次枚举这一段下边界的最后一个0在j位置,那么概率就是fj-1 * (1 - q) * (长为i-j的一段最下面全是1,符合条件的概率)。

考虑怎么求最后那个东西。

发现把最下面一行去掉之后好像有点像一个子问题?然而好像不行...实际上是一种类似最值分治的做法。

考虑这些列中最低的一列在哪(枚举得到),然后左右两边就是一个真实子问题,而中间这一列就是n = 1的部分分。但是还是不知道最低一列到底有多低...发现k只有1000,所以就可以枚举?

然而正解是多加一维状态表示高度。设gi,j表示1001 * i的矩形,最下面j * i的矩形全是1,且满足条件的概率。设j + 1行第一个0在p位置,那么gi,j += gp-1,j+1 * gi-p,j * qj * (1-q)。

边界条件就是g0,x = 1。

这东西难调死了......注意fn其实等于gn,0

 /**
* There is no end though there is a start in space. ---Infinity.
* It has own power, it ruins, and it goes though there is a start also in the star. ---Finite.
* Only the person who was wisdom can read the most foolish one from the history.
* The fish that lives in the sea doesn't know the world in the land.
* It also ruins and goes if they have wisdom.
* It is funnier that man exceeds the speed of light than fish start living in the land.
* It can be said that this is an final ultimatum from the god to the people who can fight.
*
* Steins;Gate
*/ #include <bits/stdc++.h> typedef long long LL;
const int N = , MO = ; int n, K, q, g[N][N], f[N], pw[N]; inline int qpow(int a, int b) {
int ans = ;
while(b) {
if(b & ) ans = 1ll * ans * a % MO;
a = 1ll * a * a % MO;
b = b >> ;
}
return ans;
} inline int cal(int k) {
if(k < ) return ;
if(k == ) return qpow( - q + MO, n);
memset(f, , sizeof(f));
memset(g, , sizeof(g)); for(int i = ; i <= k + ; i++) {
g[][i] = ;
} for(int i = ; i <= k; i++) {
for(int j = k / i; j >= ; j--) {
/// g[i][j]
g[i][j] = g[i][j + ];
for(int p = ; p <= i; p++) {
(g[i][j] += 1ll * g[p - ][j + ] * g[i - p][j] % MO * pw[j] % MO * ( - q + MO) % MO) %= MO;
}
//printf("g %d %d = %d \n", i, j, g[i][j]);
}
} //puts(""); /// cal f
f[] = ;
for(int i = ; i <= n; i++) {
/// f[i]
if(i <= k) f[i] = g[i][];
for(int j = std::max(, i - k); j <= i; j++) {
(f[i] += 1ll * f[j - ] * ( - q + MO) % MO * g[i - j][] % MO) %= MO;
}
//printf("f %d = %d \n", i, f[i]);
} //printf("\n\n"); return f[n];
} /*
2 2 1 2
*/ int main() {
int x, y;
scanf("%d%d%d%d", &n, &K, &x, &y);
q = 1ll * x * qpow(y, MO - ) % MO;
//printf("q = %d \n", q);
pw[] = ;
for(int i = ; i <= K; i++) {
pw[i] = 1ll * pw[i - ] * q % MO;
} if(n == ) {
int ans = 1ll * qpow(q, K) * ( - q + MO) % MO;
printf("%d\n", ans);
return ;
} int ans = (cal(K) - cal(K - ) + MO) % MO;
printf("%d\n", ans); return ;
}

70分代码

于是我们来个矩阵快速幂优化,获得了90分的好成绩!

 #include <bits/stdc++.h>

 typedef long long LL;
const int N = , MO = ; int n, K, q, g[N][N], f[N], pw[N];
int A[][], ANS[][], C[][]; inline int qpow(int a, int b) {
int ans = ;
while(b) {
if(b & ) ans = 1ll * ans * a % MO;
a = 1ll * a * a % MO;
b = b >> ;
}
return ans;
} inline void mulself(int k) {
memset(C, , sizeof(C));
for(int p = ; p <= k; p++) {
for(int j = ; j <= k; j++) {
for(int i = ; i <= k; i++) {
(C[i][j] += 1ll * A[i][p] * A[p][j] % MO) %= MO;
}
}
}
memcpy(A, C, sizeof(A));
return;
} inline void mul(int k) {
memset(C, , sizeof(C));
for(int p = ; p <= k; p++) {
for(int j = ; j <= k; j++) {
for(int i = ; i <= k; i++) {
(C[i][j] += 1ll * ANS[i][p] * A[p][j] % MO) %= MO;
}
}
}
memcpy(ANS, C, sizeof(C));
return;
} inline int cal(int k) {
if(k < ) return ;
if(k == ) return qpow( - q + MO, n);
memset(f, , sizeof(f));
memset(g, , sizeof(g)); for(int i = ; i <= k + ; i++) {
g[][i] = ;
} for(int i = ; i <= k; i++) {
for(int j = k / i; j >= ; j--) {
/// g[i][j]
g[i][j] = g[i][j + ];
for(int p = ; p <= i; p++) {
(g[i][j] += 1ll * g[p - ][j + ] * g[i - p][j] % MO * pw[j] % MO * ( - q + MO) % MO) %= MO;
}
//printf("g %d %d = %d \n", i, j, g[i][j]);
}
} //puts(""); /// cal f
if(n <= ) {
f[] = ;
for(int i = ; i <= n; i++) {
/// f[i]
if(i <= k) f[i] = g[i][];
for(int j = std::max(, i - k); j <= i; j++) {
(f[i] += 1ll * f[j - ] * ( - q + MO) % MO * g[i - j][] % MO) %= MO;
}
//printf("f %d = %d \n", i, f[i]);
}
return f[n];
}
else {
memset(ANS, , sizeof(ANS));
for(int i = ; i <= k; i++) {
ANS[i][i] = ;
}
memset(A, , sizeof(A));
for(int i = ; i < k; i++) {
A[i + ][i] = ;
}
for(int i = ; i <= k; i++) {
A[i][k] = 1ll * g[k - i][] * ( - q + MO) % MO;
}
int b = n - k;
while(b) {
if(b & ) {
mul(k);
}
mulself(k);
b = b >> ;
}
/// mul g ans
int ans = ;
for(int i = ; i <= k; i++) {
(ans += 1ll * g[i][] * ANS[i][k] % MO) %= MO;
}
return ans;
}
} /*
2 2 1 2
*/ int main() {
int x, y;
scanf("%d%d%d%d", &n, &K, &x, &y);
q = 1ll * x * qpow(y, MO - ) % MO;
//printf("q = %d \n", q);
pw[] = ;
for(int i = ; i <= K; i++) {
pw[i] = 1ll * pw[i - ] * q % MO;
} if(n == ) {
int ans = 1ll * qpow(q, K) * ( - q + MO) % MO;
printf("%d\n", ans);
return ;
} int ans = (cal(K) - cal(K - ) + MO) % MO;
printf("%d\n", ans); return ;
}

90分代码

弃疗了弃疗了...

LOJ#2304 泳池的更多相关文章

  1. LOJ 2304 「NOI2017」泳池——思路+DP+常系数线性齐次递推

    题目:https://loj.ac/problem/2304 看了各种题解…… \( dp[i][j] \) 表示有 i 列.第 j 行及以下默认合法,第 j+1 行至少有一个非法格子的概率,满足最大 ...

  2. LOJ#2304. 「NOI2017」泳池

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

  3. [Noi2016]区间 BZOJ4653 洛谷P1712 Loj#2086

    额... 首先,看到这道题,第一想法就是二分答案+线段树... 兴高采烈的认为我一定能AC,之后发现n是500000... nlog^2=80%,亲测可过... 由于答案是求满足题意的最大长度-最小长 ...

  4. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  5. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  6. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

  7. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

  8. Loj #2542. 「PKUWC2018」随机游走

    Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...

  9. Loj #2331. 「清华集训 2017」某位歌姬的故事

    Loj #2331. 「清华集训 2017」某位歌姬的故事 IA 是一名会唱歌的女孩子. IOI2018 就要来了,IA 决定给参赛选手们写一首歌,以表达美好的祝愿.这首歌一共有 \(n\) 个音符, ...

随机推荐

  1. Eclipse4JavaEE配置Tomcat运行环境

    如果我们想搭一个网站,我们可以使用Eclipse for JavaEE IDE进行开发. 初次使用需要配置网站的运行环境,可以去Apache官网下载Tomcat 8.5或Tomcat 9的版本 然后打 ...

  2. JAVA设计模式——简单工厂

    工厂模式分为三种:简单工厂模式,工厂方法模式,抽象工厂模式.我看有的书上和有的文章里是分为两种,没有简单工厂. 工厂模式主要的作用是:一个对象在实例化的时候可以选择多个类,在实例化的时候根据一些业务规 ...

  3. Django之路由分发和反向解析

    一.路由分发: 路由分发是指:总路由不再直接做路由与视图函数的对应关系,而是将获取的路由分发给下面的app去处理对应关系 from django.conf.urls import url,includ ...

  4. 【设计模式】桥接模式 Bridge Pattern

    开篇还是引用吕振宇老师的那篇经典的文章<设计模式随笔-蜡笔与毛笔的故事>.这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了. 现在市面上卖的蜡笔很多,各种型号, ...

  5. 通过 Sqoop1.4.7 将 Mysql5.7、Hive2.3.4、Hbase1.4.9 之间的数据导入导出

    目录 目录 1.什么是 Sqoop? 2.下载应用程序及配置环境变量 2.1.下载 Sqoop 1.4.7 2.2.设置环境变量 2.3.设置安装所需环境 3.安装 Sqoop 1.4.7 3.1.修 ...

  6. lua_local变量在new时不会被清空

    前言 我的运行环境 Lua5.3 按照我们以往的Java或C#编程经验,如果一个class被new,那么这个class中所有成员变量的值都是默值或是构造函数中赋的值,但在Lua中的local变量却并不 ...

  7. webapi返回文件流

    逻辑说明 webapi返回类型为IHttpActionResult接口,内部方法返回HttpResponseMessage. public interface IHttpActionResult { ...

  8. 基本服务器的AAA实验(Cisco PT)

    1.实验拓扑 2.不通网段间的ping通测试 从pc-a ping到pc-b 从pc-a ping到pc-c 从pc-b ping到pc-c 3.配置过程 a.在路由器R1上配置一个本地用户账号并且利 ...

  9. Linux:Day17(上) gawk基础

    GNU awk: 文本处理三工具:grep,sed,awk grep,egrep,fgrep:文本过滤工具:pattern sed:行编辑器 模式空间.保持空间 awk:报告生成器,格式化文本输出: ...

  10. 技术的极限(6): 密码朋克精神(Cypherpunk Spirit)

    上一篇:技术的极限(5): 识别计算与技术背后的心智 下一篇:技术的极限(7): 处理复杂与分层 目录: ** 0x01 数据和App分离 ** 0x02 蒸汽朋克/赛博朋克/密码朋克 ** 0x03 ...