5.19 省选模拟赛 小B的夏令营 概率 dp 前缀和优化dp
LINK:小B的夏令营


这道题是以前从没见过的优化dp的方法 不过也在情理之中.
注意读题 千万不要像我这个sb一样 考完连题意都不知道是啥.
一个长方形 要求从上到下联通的概率。
容易发现 K天只是用来计算概率的 和 dp的状态无关。
我们可以逐行 dp.
容易设f[i][l][r]表示前i行 当前行l~r没有被摧毁的概率。
考虑在k天之后第i行 l~r没被摧毁的概率。
l-1在这k天被摧毁了 那么因为有序 概率为\(C(k,l-1)p^{l-1}(1-p)^{k-l+1}\)
对于r的那边同理。
暴力转移 就是枚举上一层的L,R 使得L~R与l~r的交集不为空.
整个时间复杂度为n^5.
考虑 快速得到L~R 对 l~r的贡献 发现 求和l~r有交比较困难。
考虑容斥 那么就是总-左端点在r之后-右端点在l之前即可。
这样就可以优化到n^3 值得注意的是 上述两种情况其实是对等的 所以只需要求一种即可。
inline int mul(int a,int b){return (ll)a*b%mod;}
inline int add(int a,int b){return a+b>=mod?a+b-mod:a+b;}
inline int mux(int a,int b){return a-b<0?a-b+mod:a-b;}
const int MAXN=510,maxn=100010;
int n,m,p,k;
int f[2][MAXN][MAXN];
int fac[maxn],inv[maxn],w[maxn],w1[MAXN];
inline int ksm(int b,int p)
{
int cnt=1;
while(p){if(p&1)cnt=mul(cnt,b);b=mul(b,b);p=p>>1;}
return cnt;
}
inline void prepare(int maxx)
{
fac[0]=1;
rep(1,maxx,i)fac[i]=mul(fac[i-1],i);
inv[maxx]=ksm(fac[maxx],mod-2);
fep(maxx-1,0,i)inv[i]=mul(inv[i+1],i+1);
}
inline int C(int a,int b){return a<b?0:(ll)fac[a]*inv[b]%mod*inv[a-b]%mod;}
int main()
{
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
get(n);get(m);p=(ll)read()*ksm(read(),mod-2)%mod;get(k);
prepare(max(n,k));
rep(0,min(k,m),i)w[i]=mul(mul(C(k,i),ksm(p,i)),ksm(1-p+mod,k-i));
int u=0;f[u][1][m]=1;
rep(1,n,T)
{
int ans=0;
rep(1,m,i)w1[i]=0;
rep(1,m,i)rep(i,m,j)
{
ans=add(ans,f[u][i][j]);
w1[j]=add(w1[j],f[u][i][j]);
}
rep(1,m,i)w1[i]=add(w1[i],w1[i-1]);
u=u^1;
rep(1,m,i)rep(i,m,j)
f[u][i][j]=mul(mux(mux(ans,w1[i-1]),w1[m-j]),mul(w[i-1],w[m-j]));
}
int ans=0;
rep(1,m,i)rep(i,m,j)ans=add(ans,f[u][i][j]);
put(ans);
return 0;
}
考虑100分的做法:
状态的维度都是n^3的 必须要降维.
按行划分是必要的 所以只能把左端点给省掉或者把右端点给省掉.
我是将前者省掉 设状态f[i][j]表示到了第i行 以j为右端点的概率。
这次需要先枚举l进行转移 实际上这个枚举可以经过预处理之后O(1)得到。
所以 复杂度被降到了nm.
值得注意的是 需要把状态转移方程给写清楚 然后考虑预处理哪些项来计算。
不要像我一样迷瞪半天...
inline int mul(int a,int b){return (ll)a*b%mod;}
inline int add(int a,int b){return a+b>=mod?a+b-mod:a+b;}
inline int mux(int a,int b){return a-b<0?a-b+mod:a-b;}
const int MAXN=1510,maxn=100010;
int n,m,p,k;
int f[MAXN][MAXN];//f[i][j]表示前i行 右端点在j的概率.
int fac[maxn],inv[maxn],w[maxn],w1[maxn],w2[maxn];
inline int ksm(int b,int p)
{
int cnt=1;
while(p){if(p&1)cnt=mul(cnt,b);b=mul(b,b);p=p>>1;}
return cnt;
}
inline void prepare(int maxx)
{
fac[0]=1;
rep(1,maxx,i)fac[i]=mul(fac[i-1],i);
inv[maxx]=ksm(fac[maxx],mod-2);
fep(maxx-1,0,i)inv[i]=mul(inv[i+1],i+1);
}
inline int C(int a,int b){return a<b?0:(ll)fac[a]*inv[b]%mod*inv[a-b]%mod;}
int main()
{
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
get(n);get(m);p=(ll)read()*ksm(read(),mod-2)%mod;get(k);
prepare(max(n,k));
rep(0,min(k,m),i)w[i]=mul(mul(C(k,i),ksm(p,i)),ksm(1-p+mod,k-i));
f[0][m]=1;
rep(1,n,i)
{
int ww1=0;int cnt=0;int cc=0;
rep(1,m,j)
{
cnt=add(cnt,f[i-1][j]);
ww1=add(ww1,f[i-1][j]);
w1[j]=add(w1[j-1],mul(w[j],ww1));
w2[j]=ww1;
}
rep(1,m,j)
{
cc=add(cc,w[j-1]);
f[i][j]=mux(mux(mul(cc,cnt),w1[j-1]),mul(cc,w2[m-j]));
f[i][j]=mul(f[i][j],w[m-j]);
}
}
int ans=0;
rep(1,m,i)ans=add(ans,f[n][i]);
put(ans);
return 0;
}
5.19 省选模拟赛 小B的夏令营 概率 dp 前缀和优化dp的更多相关文章
- 5.19 省选模拟赛 小B的图 最小生成树 LCT
LINK:小B的图 这道题就比较容易了. 容易想到将询问离线 然后 从小到大排序 那么显然是优先放正图(x+k)的边. 考虑随着x的增大 那么负图上的边会逐渐加进来 一条边被加进来当且仅当 其权值小于 ...
- 5.19 省选模拟赛 T1 小B的棋盘 双指针 性质
LINK:小B的棋盘 考试的时候没有认真的思考 导致没做出来. 容易发现 当k>=n的时候存在无限解 其余都存在有限解 对于30分 容易想到暴力枚举 对称中心 然后 n^2判断. 对于前者 容易 ...
- 「HGOI#2019.4.19省选模拟赛」赛后总结
t1-Painting 这道题目比较简单,但是我比较弱就只是写了一个链表合并和区间DP. 别人的贪心吊打我的DP,嘤嘤嘤. #include <bits/stdc++.h> #define ...
- 6.10 省选模拟赛 小C的利是 高斯消元 矩阵行列式
LINK:小C的利是 想起来把这道题的题解写了 .一个常识:利是在广东那边叫做红包. 关于行列式的题目 不过我不太会23333..口胡还是可以的. 容易想到10分的状压.不过没什么意思. 仔细观察要求 ...
- 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解
今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...
- LOJ 6089 小Y的背包计数问题 —— 前缀和优化DP
题目:https://loj.ac/problem/6089 对于 i <= √n ,设 f[i][j] 表示前 i 种,体积为 j 的方案数,那么 f[i][j] = ∑(1 <= k ...
- Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
小明用积木搭了一个城堡. 为了方便,小明在搭的时候用的是一样大小的正方体积本,搭在了一个 n 行 m 列的方格图上,每个积木正好占据方格图的一个小方格. 当然,小明的城堡并不是平面的,而是立体的.小明 ...
- Java 第十一届 蓝桥杯 省模拟赛 小明植树(DFS)
小明植树 题目 问题描述 小明和朋友们一起去郊外植树,他们带了一些在自己实验室精心研究出的小树苗. 小明和朋友们一共有 n 个人,他们经过精心挑选,在一块空地上每个人挑选了一个适合植树的位置,总共 n ...
- 省选模拟赛第四轮 B——O(n^4)->O(n^3)->O(n^2)
一 稍微转化一下,就是找所有和原树差距不超过k的不同构树的个数 一个挺trick的想法是: 由于矩阵树定理的行列式的值是把邻接矩阵数值看做边权的图的所有生成树的边权乘积之和 那么如果把不存在于原树中的 ...
随机推荐
- H5调用手机的相机/摄像/录音等功能 _input:file的capture属性说明
H5使用input标签调用系统默许相机,摄像,录音功能.使用input:file标签, 去调用系统默认相机,摄像,录音功能,其实是有个capture属性,直接说明需要调用什么功能: <input ...
- HTML条件注释_关于IE条件注释
普通的HTML注释形式是 <!-- 注释 --> 而IE5~IE9这5个版本的IE浏览器还另外支持一种特殊的if条件注释(感觉有点类似模板渲染时的语法结构) <!--[if IE]& ...
- P1220 关路灯——区间dp
P1220 关路灯 题目描述 某一村庄在一条路线上安装了 \(n\) 盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一 ...
- 线性DP之小烈送菜
小烈送菜 小烈一下碰碰车就被乐满地的工作人员抓住了.作为扰乱秩序的惩罚,小烈必须去乐满地里的"漓江村"饭店端盘子. 服务员的工作很繁忙.他们要上菜,同时要使顾客们尽量高兴.一位服务 ...
- Jmeter系列(39)- Jmeter 分布式测试
如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 为什么要做分布式 Jmeter 本身的 ...
- docker入门、LXC、windows container 和 Hyper知识基础、实用情况
虚拟机与容器 很明显可以看出两者在操作系统级别上的隔离和进程上的隔离的区别,VM因为隔离级别更高明显更重. linux容器主要技术特点: 文件系统隔离:每个容器都有自己的root文件系统 进程隔离:每 ...
- shell专题(三):Shell脚本入门
1.脚本格式 脚本以#!/bin/bash开头(指定解析器) 2.第一个Shell脚本:helloworld (1)需求:创建一个Shell脚本,输出helloworld (2)案例实操: [atgu ...
- CSS背景处理
CSS背景处理 背景样式 背景颜色 如果想让一个区域具有纯色的背景,可以使用background-color进行设置,背景颜色可以是rgb,rgba,#16网页色. <!DOCTYPE html ...
- 状态模式(c++实现)
状态模式 目录 状态模式 模式定义 模式动机 UML类图 源码实现 优点 缺点 模式定义 状态模式(state),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 模式动机 状 ...
- Burp Suite Target Module - 目标模块
模块目的之一:获取网站分析 1.从Proxy - HTTP history界面选中需要加入Target Scope的Host 地址,右击,选中Add to Scope. 2.打开Target - Sc ...