ABC216H - Random Robots(容斥,状压DP)
题面
有
K
K
K 个机器人初始分别位于数轴上
x
1
,
x
2
,
.
.
.
,
x
K
x_1,x_2,...,x_{K}
x1,x2,...,xK 的整点位置。
接下来会经历
N
N
N 秒,每一秒都会发生如下事件:
- 每个机器人分别有一半的概率停住不动,有一般的概率往坐标轴正方向移动一单位距离。每个机器人的移动是同时进行的。
问机器人互相不碰撞的概率是多少。对
998244353
998244353
998244353 取模。
2
≤
K
≤
10
,
1
≤
N
≤
1000
,
0
≤
x
1
<
x
2
<
.
.
.
<
x
K
≤
1000
.
2\leq K\leq10,1\leq N\leq1000,0\leq x_1<x_2<...<x_K\leq1000\,.
2≤K≤10,1≤N≤1000,0≤x1<x2<...<xK≤1000.
题解
听说要用
L
G
V
\tt LGV
LGV ?听他吹吧
还是离得挺远的,只是用了下
L
G
V
\tt LGV
LGV 引理的核心——容斥原理罢了。
把问题转化到二维平面,每个机器人在
x
x
x 轴方向照常,在
y
y
y 轴方向每秒都前进一格。看起来是不是很像
L
V
G
\tt LVG
LVG 的问题了?但这样完全没用。
我们把最终的机器人序列从左到右记录为
P
P
P,为了利用容斥原理,我们定义一个不合法条件为某个逆序对是否存在,因为存在某个逆序对,可以等价于两个机器人相撞,而最终答案不受影响。可以用
L
G
V
LGV
LGV 引理的路径交换思想加深理解。
形式化地,我们可以把答案表示为:
∑
P
,
Q
(
−
1
)
σ
(
P
)
⋅
(
1
2
)
N
K
⋅
∏
i
=
1
K
C
(
N
,
Q
i
−
x
i
)
\sum_{P,Q} (-1)^{σ(P)}\cdot(\frac{1}{2})^{NK}\cdot\prod_{i=1}^K {\rm C}(N,Q_i-x_i)
P,Q∑(−1)σ(P)⋅(21)NK⋅i=1∏KC(N,Qi−xi)
序列
Q
Q
Q 是最终的位置序列,是递增的,中间的
(
1
2
)
N
K
(\frac{1}{2})^{NK}
(21)NK 是一个方案的概率,右边用组合数算出了每种
(
P
,
Q
)
(P,Q)
(P,Q) 的情况数。
现在,我们面前有两个艰难的选择:壹,用状态压缩DP来模拟排列
P
P
P 的形成,同时用DP模拟序列
Q
Q
Q 的形成;贰,无比简单地直接枚举排列,然后计算别的,序列
Q
Q
Q 、组合数……
后者,
n
!
n!
n! 直接达到了
3
e
6
3e6
3e6 级别,后面的没法算了。所以我们选择前者。定义
d
p
[
S
]
[
j
]
dp[S][j]
dp[S][j] 表示当前已经往排列中(从左往右)填入的机器人集合为
S
S
S,同时最靠右的机器人最终位置
≤
j
\leq j
≤j 的带权方案数。加入一个机器人,可以通过
S
S
S 算出前面比它标号大的个数,维护逆序对,而且它的最终位置要比前面的都靠右,所以很好维护,我们令
d
(
S
,
i
)
d(S,i)
d(S,i) 表示
S
S
S 中比
i
i
i 标号大的机器人个数,有如下转移:
d
p
[
S
]
[
j
]
=
d
p
[
S
]
[
j
−
1
]
+
∑
i
∈
S
(
−
1
)
d
(
S
,
i
)
d
p
[
∁
S
i
]
[
j
−
1
]
⋅
C
(
N
,
j
−
x
i
)
⋅
(
1
2
)
N
dp[S][j]=dp[S][j-1]~~+~~\sum_{i\in S}(-1)^{d(S,i)}dp[\complement_S\,i][j-1]\cdot {\rm C}(N,j-x_i)\cdot (\frac{1}{2})^{N}
dp[S][j]=dp[S][j−1] + i∈S∑(−1)d(S,i)dp[∁Si][j−1]⋅C(N,j−xi)⋅(21)N
最终答案就是
d
p
[
U
]
[
max
x
+
N
]
dp[U][\max x+N]
dp[U][maxx+N] 取模
998244353
998244353
998244353 ,时间复杂度
O
(
2
K
K
N
)
{\rm O}(2^{K}KN)
O(2KKN) 。
如何评价 jiangly 说用
L
G
V
\tt LGV
LGV ,结果代码打的是状压DP ? 其实说的有道理。
CODE
#include<set>
#include<map>
#include<stack>
#include<cmath>
#include<ctime>
#include<queue>
#include<bitset>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 1005
#define LL long long
#define DB double
#define ENDL putchar('\n')
#define lowbit(x) (-(x) & (x))
#define FI first
#define SE second
#define SI(x) multiset<x>::iterator
#define MI map<int,int>::iterator
#define eps (1e-4)
#pragma GCC optimize(2)
LL read() {
LL f=1,x=0;char s = getchar();
while(s < '0' || s > '9') {if(s=='-')f = -f;s = getchar();}
while(s >= '0' && s <= '9') {x=x*10+(s-'0');s = getchar();}
return f*x;
}
void putpos(LL x) {
if(!x) return ;
putpos(x/10); putchar('0'+(x%10));
}
void putnum(LL x) {
if(!x) putchar('0');
else if(x < 0) putchar('-'),putpos(-x);
else putpos(x);
}
void AIput(LL x,char c) {putnum(x);putchar(c);}
const int MOD = 998244353;
int n,m,s,o,k;
int dp[1<<10|5][MAXN<<1];
int fac[MAXN<<1],inv[MAXN<<1],invf[MAXN<<1];
int invp[MAXN<<1];
int C(int n,int m) {
if(m < 0 || m > n) return 0;
return fac[n] *1ll* invf[n-m] % MOD *1ll* invf[m] % MOD;
}
int F(int xx) {
return C(m,xx) *1ll* invp[m] % MOD;
}
int xx[MAXN];
int main() {
n = read(); m = read();
for(int i = 1;i <= n;i ++) {
xx[i] = read() + 1;
}
fac[0]=fac[1]=inv[0]=inv[1]=invf[0]=invf[1]=1;
invp[0] = 1;
for(int i = 2;i <= m+3;i ++) {
fac[i] = fac[i-1] *1ll* i % MOD;
inv[i] = (MOD-inv[MOD%i]) *1ll* (MOD/i) % MOD;
invf[i] = invf[i-1] *1ll* inv[i] % MOD;
}
for(int i = 1;i <= m;i ++) invp[i] = invp[i-1] *1ll* inv[2] % MOD;
dp[0][0] = 1;
for(int j = 1;j <= m+1001;j ++) dp[0][j] = 1;
int tp = (1<<n);
for(int i = 1;i < tp;i ++) {
for(int j = 1;j <= m+1001;j ++) {
int kk = 1;
dp[i][j] = dp[i][j-1];
for(int k = n;k > 0;k --) {
if(i & (1<<(k-1))) {
(dp[i][j] += kk*1ll*dp[i-(1<<(k-1))][j-1] % MOD *1ll* F(j-xx[k]) % MOD) %= MOD;
kk = MOD-kk;
}
}
}
}
printf("%d\n",dp[tp-1][m+1001]);
return 0;
}
ABC216H - Random Robots(容斥,状压DP)的更多相关文章
- bzoj2669[cqoi2012]局部极小值 容斥+状压dp
2669: [cqoi2012]局部极小值 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 774 Solved: 411[Submit][Status ...
- ARC 093 F Dark Horse 容斥 状压dp 组合计数
LINK:Dark Horse 首先考虑1所在位置. 假设1所在位置在1号点 对于此时剩下的其他点的方案来说. 把1移到另外一个点 对于刚才的所有方案来说 相对位置不变是另外的方案. 可以得到 1在任 ...
- [BZOJ2669][CQOI2012]局部最小值(容斥+状压DP)
发现最多有8个限制位置,可以以此为基础DP和容斥. $f_{i,j}=f_{i-1,j}\times (cnt_j-i+1)+\sum_{k\subset j} f_{i-1,k}$ $cnt_j$表 ...
- bzoj3812 主旋律 容斥+状压 DP
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3812 题解 考虑对于图的联通性的 DP 的一般套路:总方案 - 不连通的方案. 那么我们只需要 ...
- Comet OJ - Contest #7 C 临时翻出来的题(容斥+状压)
题意 https://www.cometoj.com/contest/52/problem/C?problem_id=2416 思路 这里提供一种容斥的写法(?好像网上没看到这种写法) 题目要求编号为 ...
- HDU5731 Solid Dominoes Tilings 状压dp+状压容斥
题意:给定n,m的矩阵,就是求稳定的骨牌完美覆盖,也就是相邻的两行或者两列都至少有一个骨牌 分析:第一步: 如果是单单求骨牌完美覆盖,请先去学基础的插头dp(其实也是基础的状压dp)骨牌覆盖 hiho ...
- ARC093F Dark Horse 【容斥,状压dp】
题目链接:gfoj 神仙计数题. 可以转化为求\(p_1,p_2,\ldots,p_{2^n}\),使得\(b_i=\min\limits_{j=2^i+1}^{2^{i+1}}p_j\)都不属于\( ...
- BZOJ 2560: 串珠子 (状压DP+枚举子集补集+容斥)
(Noip提高组及以下),有意者请联系Lydsy2012@163.com,仅限教师及家长用户. 2560: 串珠子 Time Limit: 10 Sec Memory Limit: 128 MB Su ...
- UOJ #129 / BZOJ 4197 / 洛谷 P2150 - [NOI2015]寿司晚宴 (状压dp+数论+容斥)
题面传送门 题意: 你有一个集合 \(S={2,3,\dots,n}\) 你要选择两个集合 \(A\) 和 \(B\),满足: \(A \subseteq S\),\(B \subseteq S\), ...
随机推荐
- SpringCloud微服务实战——搭建企业级开发框架(四十二):集成分布式任务调度平台XXL-JOB,实现定时任务功能
定时任务几乎是每个业务系统必不可少的功能,计算到期时间.过期时间等,定时触发某项任务操作.在使用单体应用时,基本使用Spring提供的注解即可实现定时任务,而在使用微服务集群时,这种方式就要考虑添 ...
- 基于Kubernetes v1.24.0的集群搭建(一)
一.写在前面 K8S 1.24作为一个很重要的版本更新,它为我们提供了很多重要功能.该版本涉及46项增强功能:其中14项已升级为稳定版,15项进入beta阶段,13项则刚刚进入alpha阶段.此外,另 ...
- 基于MybatisPlus代码生成器(2.0新版本)
一.模块简介 1.功能亮点 实时读取库表结构元数据信息,比如表名.字段名.字段类型.注释等,选中修改后的表,点击一键生成,代码成即可提现出表结构的变化. 单表快速转化restful风格的API接口并对 ...
- webpack中文api
1. 简介 1.Plugins://插件 webpack has a rich plugin interface.Most of the features are internal plug ...
- cookie 案例 记住上一次的访问时间
需求:记住上一次的访问时间 第一次访问Servlet 提示 欢迎首次访问 之后的访问 都提示 您上次的访问时间为:"""""""& ...
- NC21181 重返小学
NC21181 重返小学 题目 题目描述 时光依旧,岁月匆匆.转眼间,曾经的少年郭嘉烜已经长大成人,考上了一所优秀的大学--兰州大学.在经历了一年来自牛顿.莱布尼茨.拉普拉斯的精神洗礼后,他终于决 ...
- Deep Learning-深度学习(一)
深度学习入门 1.人工智能.机器学习.深度学习 1.1 人工智能(AI) 一个比较宽泛的概念.即用来模拟人的智能的理论,并对这个模拟出来的智能进行延伸和开拓.通俗来讲就是要达到用机器模拟人类的聪慧来处 ...
- 从入门到爱上Git
时间不在于你拥有多少,而在于你怎样使用------时之沙 · 艾克 一.Git设置 1.1 Git全局设置 当我们安装好Git以后,我们需要对Git进行账号.邮箱的设置 设置用户信息 git conf ...
- JavaScript进阶知识点——函数和对象详解
JavaScript进阶知识点--函数和对象详解 我们在上期内容中学习了JavaScript的基本知识点,今天让我们更加深入地了解JavaScript JavaScript函数 JavaScript函 ...
- cookie和seesion的区别和联系
今天来聊聊cookie和session的区别和联系.首先先确定一个各自的定义吧: cookies: 网站用于鉴别用户身份和追踪用户登录状态. 存在于浏览器端的一小段文本数据 session: 中文称之 ...