Solution -「LOCAL」客星璀璨之夜
\(\mathcal{Description}\)
给定坐标轴上的 \(2n+1\) 个坐标 \(x_1,x_2,\cdots,x_{2n+1}\),其中偶数下标的位置是一个小球,奇数下标的位置是一个球洞。每次操作随机选择一个小球,并随机让它向左或向右滚入临近的球洞,该球洞被填满,视作平地。求所有球进洞后,球滚动总距离的期望。对 \(998244353\) 取模。
\(n\le3000\)。
\(\mathcal{Solution}\)
显然,\(n\) 个球进洞的总方案为 \(2^nn!\),记为 \(g(n)\)。现只需要计算所有方案的滚动距离之和。坐标实际位置并不重要,考虑一段形如 \(x_i\leftrightarrow x_{i+1}\) 的距离在多少种方案中贡献。
贡献次数显然仅与 \(n\) 和位置 \(i\) 有关。令 \(f(i,j)\) 表示仅有 \(i\) 个球(和 \(i+1\) 个洞)时,\(x_j\leftrightarrow x_{j+1}\) 的贡献次数。转移时,考虑当前局面第一次操作:
让 \(x_j\) 和 \(x_{j+1}\) 配对消失,贡献次数为剩下 \(i-1\) 个球撞完的总方案数,即 \(g(n-1)\),并且 \(x_j\leftrightarrow x_{j+1}\) 这一段被纳入了\(x_{j-1}\leftrightarrow x_{j+2}\),转移需要让坐标前移一位,那么 \(f(i,j) \leftarrow f(i,j)+g(i-1)+f(i-1,j-1)\)。
操作 \(j\) 前面的球,有 \(j-1\) 种等价操作方式,当前这段没有贡献,坐标向前两位,即 \(f(i,j) \leftarrow f(i,j)+(j-1)f(i-1,j-2)\)。
操作 \(j+1\) 后面的球,有 \(2i-j\) 种等价操作方式,当前这段还是没有贡献,坐标也没有影响,即 \(f(i,j) \leftarrow f(i,j)+(2i-j)f(i-1,j)\)。
综上:
\]
答案显而易见:
\]
复杂度 \(\mathcal O(n^2)\)。
\(\mathcal{Code}\)
/* Clearink */
#include <cstdio>
inline int rint () {
int x = 0, f = 1; char s = getchar ();
for ( ; s < '0' || '9' < s; s = getchar () ) f = s == '-' ? -f : f;
for ( ; '0' <= s && s <= '9'; s = getchar () ) x = x * 10 + ( s ^ '0' );
return x * f;
}
template<typename Tp>
inline void wint ( Tp x ) {
if ( x < 0 ) putchar ( '-' ), x = ~ x + 1;
if ( 9 < x ) wint ( x / 10 );
putchar ( x % 10 ^ '0' );
}
const int MAXN = 3000, MOD = 998244353;
int n, m, x[MAXN * 2 + 5], g[MAXN + 5], f[MAXN + 5][MAXN * 2 + 5];
inline int& addeq ( int& a, const int b ) {
return ( a += b ) < MOD ? a : a -= MOD;
}
inline int qkpow ( int a, int b, const int p = MOD ) {
int ret = 1;
for ( ; b; a = 1ll * a * a % p, b >>= 1 ) ret = 1ll * ret * ( b & 1 ? a : 1 ) % p;
return ret;
}
int main () {
// freopen ( "stars.in", "r", stdin );
// freopen ( "stars.out", "w", stdout );
m = ( n = rint () ) << 1 | 1;
for ( int i = 1; i <= m; ++ i ) x[i] = rint ();
g[0] = 1;
for ( int i = 1; i <= n; ++ i ) {
g[i] = 2ll * i * g[i - 1] % MOD;
for ( int j = 1; j <= i << 1; ++ j ) {
addeq ( addeq ( addeq ( addeq ( f[i][j], g[i - 1] ), f[i - 1][j - 1] ),
( j - 1ll ) * f[i - 1][j - 2 < 0 ? 0 : j - 2] % MOD ),
( 2ll * i - j ) * f[i - 1][j] % MOD
);
}
}
int ans = 0;
for ( int i = 1; i <= n << 1; ++ i ) {
addeq ( ans, 1ll * ( x[i + 1] - x[i] ) * f[n][i] % MOD );
}
wint ( 1ll * ans * qkpow ( g[n], MOD - 2 ) % MOD ), putchar ( '\n' );
return 0;
}
\(\mathcal{Details}\)
考场上想的统计每一对 \(i\) 球撞 \(j\) 洞的出现次数,但这个涉及到多类方案的交叉安排,而且方案间有依赖关系……就死掉啦。
还有,暴力打半天过不了样例,手玩了一下发现距离贡献没乘方案数 qwq。
Solution -「LOCAL」客星璀璨之夜的更多相关文章
- Solution -「LOCAL」二进制的世界
\(\mathcal{Description}\) OurOJ. 给定序列 \(\{a_n\}\) 和一个二元运算 \(\operatorname{op}\in\{\operatorname{ ...
- Solution -「LOCAL」大括号树
\(\mathcal{Description}\) OurTeam & OurOJ. 给定一棵 \(n\) 个顶点的树,每个顶点标有字符 ( 或 ).将从 \(u\) 到 \(v\) ...
- Solution -「LOCAL」过河
\(\mathcal{Description}\) 一段坐标轴 \([0,L]\),从 \(0\) 出发,每次可以 \(+a\) 或 \(-b\),但不能越出 \([0,L]\).求可达的整点数. ...
- Solution -「LOCAL」Drainage System
\(\mathcal{Description}\) 合并果子,初始果子的权值在 \(1\sim n\) 之间,权值为 \(i\) 的有 \(a_i\) 个.每次可以挑 \(x\in[L,R]\) ...
- Solution -「LOCAL」Burning Flowers
灼之花好评,条条生日快乐(假装现在 8.15)! \(\mathcal{Description}\) 给定一棵以 \(1\) 为根的树,第 \(i\) 个结点有颜色 \(c_i\) 和光亮值 ...
- Solution -「LOCAL」画画图
\(\mathcal{Description}\) OurTeam. 给定一棵 \(n\) 个点的树形随机的带边权树,求所有含奇数条边的路径中位数之和.树形生成方式为随机取不连通两点连边直到全 ...
- Solution -「LOCAL」ZB 平衡树
\(\mathcal{Description}\) OurOJ. 维护一列二元组 \((a,b)\),给定初始 \(n\) 个元素,接下来 \(m\) 次操作: 在某个位置插入一个二元组: 翻 ...
- Solution -「LOCAL」舟游
\(\mathcal{Description}\) \(n\) 中卡牌,每种三张.对于一次 \(m\) 连抽,前 \(m-1\) 次抽到第 \(i\) 种的概率是 \(p_i\),第 \(m\) ...
- Solution -「LOCAL」充电
\(\mathcal{Description}\) 给定 \(n,m,p\),求序列 \(\{a_n\}\) 的数量,满足 \((\forall i\in[1,n])(a_i\in[1,m])\l ...
随机推荐
- RabbitMQ --- 直连交换机 【 有回调方法,获取消费结果 】
1.前言 上一随笔详细记录了直连交换机的方法,发送的消息是异步的,如果消息未被消费者消费,那么可以一直存在消息队列中. 那么有没有办法做一个回调,当消息被消费后,被通知消息成功被消费者消费啦? 答案是 ...
- 简单的树莓派4b装64位系统+docker和docker-compose
起因是这样的,我系统崩了 事先准备 wifi或网线 树莓派和电源 内存卡和读卡器 首先是装系统 去https://downloads.raspberrypi.org/raspios_arm64/ima ...
- testng 的常用注解
常用注解如下: @BeforeSuite: 此注解的方法会在当前测试集合中的任一测试用例前执行 @AfterSuite: 此注解的方法会在当前测试集合中的所有测试程序结束后执行 @BeforeTest ...
- python+selenium 定位元素的主要方法
selenium对web各元素的操作首先就要先定位元素,定位元素的方法主要有以下几种: 通过id定位元素:find_element_by_id("id_vaule") 通过name ...
- nginx代理图片上传以及访问 nginx 图片上传完整版
nginx代理图片上传 首先需要利用nginx代理图片访问参考 https://www.cnblogs.com/TJ21/p/12609017.html 编写接受文件的controller 1 @Po ...
- day 18 C语言顺序结构基础定义1
(1).有以下程序: 程序运行后的输出结果是[B] (A).3,5,5,3 (B).3,5,3,5 (C).5,3,3,5 (D).5,3,5,3 这个题其实也可以弄成改错题,传到函数里面要对其值操作 ...
- 【get√】golang中实现从腾讯云CVM查询网卡流量的两种方法
公众号文章链接 主要参考了以下位置的资料: 云服务器监控接口 腾讯云go-sdk example 方法一:使用腾讯云go-sdk go.mod文件中增加这样一行: github.com/tencent ...
- 前端3D引擎-Cesium自定义动态材质
本文代码基于Vue-cli4和使用WebGL的地图引擎Cesium,主要内容为三维场景下不同对象的动态材质构建. 参考了很多文章,链接附在文末. 为不同的几何对象添加动态材质 不知道这一小节的名称概况 ...
- Fastjson反序列化漏洞分析 1.2.22-1.2.24
Fastjson反序列化漏洞分析 1.2.22-1.2.24 Fastjson是Alibaba开发的Java语言编写的高性能JSON库,用于将数据在JSON和Java Object之间互相转换,提供两 ...
- 集合框架-Map集合练习-记录字母次数思路及代码
1 package cn.itcast.p10.map.test; 2 3 import java.util.Iterator; 4 import java.util.Map; 5 import ja ...